这个问题的简单版本是:为什么第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"
答案 0 :(得分:4)
好吧,我还没有阅读规范本身,因为我的最后一次Krell大脑提升已经消失,但我认为问题在于默认参数的右侧表达式包括其中的参数集范围。因此,您在a
右侧引用的=
是左侧的a
,而不是封闭式上下文中的a
。 (当然,正如您所注意到的那样,上下文可用,但参数名称会影响该上下文。)
右侧默认表达式的评估是ES2015中的调用时间。