请看这个
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func());
}
bar(); //outer
我想知道为什么输出结果是“outer”而不是“inner”。我知道JavaScript具有词法作用域。这个输出让我感觉像函数
x => foo
是在函数bar
之外定义的。请看这个
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func());
}
bar(); //outer
x => foo
是在函数bar
之外定义的。
let foo = 'inner';
中没有使用let
会得到你预期的结果吗? - Jaromanda Xfunction bar(foo, func = x => foo, otherFunc = bar)
可以将func
默认为返回参数foo
的函数,并将otherFunc
默认为函数本身,但是当然这个特殊作用域不包括函数内部的变量。 - user663031let
定义了一个新的本地变量,该变量会隐藏/覆盖先前在更高作用域中使用同名变量的定义。此外,let
只有在let
语句所在的代码行之后才生效。因此,在默认函数参数赋值中的foo
引用是外部的foo
,而不是内部的foo
,因为它是在定义一个新值的let
语句之前定义的。变量的引用是词法的。默认参数中foo
的词法引用是外部的foo
。或者换句话说,默认参数无法访问函数的作用域。 - jfriend00