【发布时间】:2017-05-28 06:01:08
【问题描述】:
看到这个
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func());
}
bar(); //outer
我想知道为什么输出是“外部”而不是“内部”。我知道 JavaScript 有词法范围。这个输出让我觉得函数x => foo是在函数bar之外定义的
【问题讨论】:
-
你明白没有
let foo = 'inner';中的let你会得到你所期望的,对吧? -
默认参数值访问函数的作用域没有多大意义,所以它们没有。
-
默认参数表达式在包含其他参数(和函数本身)的特殊范围内进行评估,因此例如
function bar(foo, func = x => foo, otherFunc = bar)将默认func用于返回参数foo的函数, 和otherFunc到函数本身,但当然,特殊作用域不包含函数内部的变量。 -
let定义了一个新的局部变量,该变量隐藏/覆盖该名称在更高范围内的任何先前定义。此外,let直到let语句所在的代码行才会生效。因此,默认函数参数分配中的foo引用是外部foo,而不是内部foo,因为它是在为foo定义新值的let语句之前定义的。对变量的引用是词法的。默认参数中foo的词法引用是外部foo。或者换句话说,默认参数无权访问函数的范围。 -
@MaazSyedAdeeb 实际上这是 Babel 中的一个错误,你可以看到这个github.com/babel/babel/issues/4173
标签: javascript web ecmascript-6