为什么默认参数和函数参数不能同名?

时间:2016-06-05 22:04:03

标签: 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"

1 个答案:

答案 0 :(得分:4)

好吧,我还没有阅读规范本身,因为我的最后一次Krell大脑提升已经消失,但我认为问题在于默认参数的右侧表达式包括其中的参数集范围。因此,您在a右侧引用的=是左侧的a,而不是封闭式上下文中的a。 (当然,正如您所注意到的那样,上下文可用,但参数名称会影响该上下文。)

右侧默认表达式的评估是ES2015中的调用时间