为什么console.log(z)会抛出NaN?

时间:2016-09-29 13:25:25

标签: javascript ecmascript-6

当它能够从外部范围中选择w时,为什么无法选择z



var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, z = z + 1 ) {
 console.log( x, y, z );
}
foo(); 




3 个答案:

答案 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