时间死区 - 默认参数 ReferenceError

我无法理解这两个代码块之间的区别以及为什么一个代码块与另一个代码块有效。我在一次关于 JS 中的临时死区的演讲中看到了这些代码片段,但是很难理解这个带有默认参数的特殊情况。


抛出一个 ReferenceError


// sample1.js

const a = 2;

function square(a = a) {

  return a * a;

}

// Does not work!

square();

作品


// sample2.js

const init = 2;

function square(a = init) {

  return a * a;

}

// Works!

square(); // => 4


白板的微信
浏览 182回答 3
3回答

慕斯王

这些变量在“内部作用域”中——甚至是 ..(a=a){...}。内部作用域中的变量将覆盖“外部作用域”中同名的(变量作用域/阴影)变量因此,当您尝试将 'a' 分配给 'a' 时 - 内部作用域 'a' 正在覆盖外部作用域中的变量,它认为您正在尝试分配正在定义过程中的东西(a = 一)。看起来有点傻 - 因为你想要做的事情的意图很明确,但这就是它的工作方式。

30秒到达战场

原因是您尝试设置的声明范围,如您所见,此代码const a = 2;function square(a = a) {  return a * a;}// Does not work!square();当你这样做时,你告诉 JS 被调用的参数a必须分配给相同的a,所以编译器会感到困惑,因为这个功能块的声明指向名为“a”的同一个参数,所以当你试图分配它时对于另一个const名称,编译器可以识别变量 no 引用当前块的相同范围。

慕田峪9158850

看起来 JS 解释器认为您正在尝试将参数a(尚未定义)分配给自身。我不确定a在这种情况下是否可以引用全局,我只会选择另一个名称以避免误解并简化代码。例如,重命名全局a来A,如果它的一些全局常量。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript