为了账号安全,请及时绑定邮箱和手机立即绑定

时间死区 - 默认参数 ReferenceError

时间死区 - 默认参数 ReferenceError

白板的微信 2021-11-12 15:32:16
我无法理解这两个代码块之间的区别以及为什么一个代码块与另一个代码块有效。我在一次关于 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 = 一)。

看起来有点傻 - 因为你想要做的事情的意图很明确,但这就是它的工作方式。


查看完整回答
反对 回复 2021-11-12
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

原因是您尝试设置的声明范围,如您所见,此代码


const a = 2;

function square(a = a) {

  return a * a;

}

// Does not work!

square();

当你这样做时,你告诉 JS 被调用的参数a必须分配给相同的a,所以编译器会感到困惑,因为这个功能块的声明指向名为“a”的同一个参数,所以当你试图分配它时对于另一个const名称,编译器可以识别变量 no 引用当前块的相同范围。


查看完整回答
反对 回复 2021-11-12
?
慕田峪9158850

TA贡献1794条经验 获得超8个赞

看起来 JS 解释器认为您正在尝试将参数a(尚未定义)分配给自身。

我不确定a在这种情况下是否可以引用全局,我只会选择另一个名称以避免误解并简化代码。例如,重命名全局aA,如果它的一些全局常量。


查看完整回答
反对 回复 2021-11-12
  • 3 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号