Jon*_*nah 6 javascript ecmascript-6
这个问题的简单版本是:为什么第3个示例中的下面的代码段中存在未定义的错误?
看起来,默认值应取自"外部" a变量,即值为的变量1.第一个测试显示"阴影"与词法范围一起使用:a函数内部仅指a函数内部,并且不知道外部a.
鉴于此,我认为没有理由为什么第二和第三次测试是不同的.这只是一个随意的巧合,在第3次测试中,我碰巧将默认值设置为封闭范围中与函数参数同名的变量.
var a = 1;
var b = 100;
function defaultParamTest1(a) {
console.log(a + 1);
}
function defaultParamTest2(a = b) {
console.log(a + 1);
}
function defaultParamTest3(a = a) {
console.log(a + 1);
}
defaultParamTest1(); // WORKS! => NaN, since function a "shadows" outer a.
defaultParamTest2(); // WORKS! => 101, as expected
defaultParamTest3(); // ERROR! => "Uncaught ReferenceError: a is not defined"Run Code Online (Sandbox Code Playgroud)
好吧,我还没有阅读规范本身,因为我最后的 Krell 大脑提升正在消退,但我认为问题在于默认参数的右侧表达式包括其范围内的参数集。因此,a您在 右侧引用的=是a左侧的 ,而不是a封闭上下文中的 。(当然,正如您所注意到的,上下文是可用的,但参数名称会影响该上下文。)
右侧默认表达式的计算是ES2015 中的调用时间。