当它能够从外部范围中选择w
时,为什么无法选择z
?
var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, z = z + 1 ) {
console.log( x, y, z );
}
foo();

答案 0 :(得分:4)
它可以从外部范围中获取
w
是的,因为你的函数中没有变量w
。
为什么无法接听
z
?
因为您的参数声明了一个名为z
的局部变量,并且它会影响全局变量。但是,本地的尚未使用默认表达式中的值进行初始化,并在访问它时抛出ReferenceError
。这就像temporal dead zone for let
/const
,
let z = z + 1;
也会抛出。您应该将变量重命名为其他内容以使其正常工作。
答案 1 :(得分:1)
第一个有效,因为w
中的w + 1
在形式参数中查找w但未找到它并且使用了外部范围。接下来,x
中的x +1
在形式参数范围内找到x的值并使用它,因此对y的赋值工作正常。
在z + 1
的最后一种情况下,它发现z
尚未在形式参数范围内初始化,并在尝试从外部范围中找到它之前抛出错误。
如@bergi所指出的那样,将变量z更改为其他内容应该可以解决问题。
var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, a = z + 1 ) {
console.log( x, y, a );
}
foo();
答案 2 :(得分:0)
function foo( x = w + 1, y = x + 1, z = z + 1 )
期间
x=w+1
x
未定义
然后w
也未定义
所以它调查本地执行上下文没有发现任何价值
所以它是outerscope并找到w = 1
因此在本地空间w
也变为1
现在
z = z + 1
位于z
左侧的=
未定义
然后位于z
右侧的=
也是未定义的,所以它寻找
z在本地执行上下文中找到一个位于左侧的z
等式,所以它不需要去外太空。
所以z
变成了unifine
但是如果你这样写z=this.z+1
,你将获得z = 3
因为this.z
不会直接查看localscope到outerscope并找到z = 2