我很难理解这两个代码块之间的区别,以及其中一个代码与另一个代码块之间的区别。我在讨论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发布于 2019-10-07 19:42:53
这些变量位于“内部作用域”--甚至是.(a=a){.}。
内部作用域中的vars将覆盖(变量作用域/阴影)变量,在“外部作用域”中使用相同的名称。
所以当你试图把'a‘赋值给'a’--内部作用域'a‘是覆盖了变量在外部作用域中的内容时,它认为你试图分配正在被定义过程中的东西(a = a)。
看起来有点傻--因为你想要做的事情的意图是明确的,但这就是它的工作方式。
发布于 2019-10-07 19:30:57
看起来JS解释器认为您正在尝试将参数a (尚未定义)赋值给自己。
我不确定在这种情况下是否可以引用全局a,我只想选择另一个名称来避免误解和简化代码。例如,如果全局a是某个全局常量,则将它重命名为A。
发布于 2019-10-07 19:38:13
原因是您试图设置的声明范围,因为您可以看到以下代码
const a = 2;
function square(a = a) {
return a * a;
}
// Does not work!
square();当您这样做时,您告诉JS,必须将名为a的参数分配给同一个a,因此编译器会感到困惑,因为这个函数块的声明指向名为"a“的相同参数,因此当您试图将其赋值给另一个const名称时,编译器可以识别变量no引用当前块的相同作用域。
https://stackoverflow.com/questions/58275952
复制相似问题