我无法理解这两个代码块之间的区别以及为什么一个代码块与另一个代码块有效。我在一次关于 JS 中的临时死区的演讲中看到了这些代码片段,但是很难理解这个带有默认参数的特殊情况。抛出一个 ReferenceError// sample1.jsconst a = 2;function square(a = a) { return a * a;}// Does not work!square();作品// sample2.jsconst init = 2;function square(a = init) { return a * a;}// Works!square(); // => 4
3 回答
慕斯王
TA贡献1864条经验 获得超2个赞
这些变量在“内部作用域”中——甚至是 ..(a=a){...}。
内部作用域中的变量将覆盖“外部作用域”中同名的(变量作用域/阴影)变量
因此,当您尝试将 'a' 分配给 'a' 时 - 内部作用域 'a' 正在覆盖外部作用域中的变量,它认为您正在尝试分配正在定义过程中的东西(a = 一)。
看起来有点傻 - 因为你想要做的事情的意图很明确,但这就是它的工作方式。
30秒到达战场
TA贡献1828条经验 获得超6个赞
原因是您尝试设置的声明范围,如您所见,此代码
const a = 2;
function square(a = a) {
return a * a;
}
// Does not work!
square();
当你这样做时,你告诉 JS 被调用的参数a必须分配给相同的a,所以编译器会感到困惑,因为这个功能块的声明指向名为“a”的同一个参数,所以当你试图分配它时对于另一个const名称,编译器可以识别变量 no 引用当前块的相同范围。
慕田峪9158850
TA贡献1794条经验 获得超8个赞
看起来 JS 解释器认为您正在尝试将参数a(尚未定义)分配给自身。
我不确定a在这种情况下是否可以引用全局,我只会选择另一个名称以避免误解并简化代码。例如,重命名全局a来A,如果它的一些全局常量。
添加回答
举报
0/150
提交
取消
