为什么z()
执行上下文不会覆盖全局x
变量?
var x = 10;
function z(){
var x = x = 20;
}
z();
console.log(x); // Why is 10 printed? Shouldn’t it be 20.
var a = b = c = 0;
这意味着b
和c
被声明为全局变量,而不是预期的本地变量。
例如:
var y = 10;
function z(){
var x = y = 20; // Global y is overridden.
}
z();
console.log(y); // Value is 20.
按照上述逻辑,x = x = 20
中的z()
表示x
是全局的,它覆盖了本地x
变量,但x
的全局值仍然是{{} 1}}。
答案 0 :(得分:3)
function z(){
var x = x = 20;
}
由于hoisting,这实际上变成了:
function z(){
var x;
x = x = 20;
}
因此该函数中x的每个实例都引用局部变量,而不是全局变量。
答案 1 :(得分:1)
var x = x = 20;
被解释为
var x;
x = (x = 20);
所以全局x没有指向。
答案 2 :(得分:0)
var x = 10;
function z(){
var x = x = 20;
}
z();
console.log(x)
本地第一个x。第二个x将不会被吊起,因为我们已经悬挂了x。所以x将在本地为20,但在全局范围内为10。
对于
var y = 10;
function z(){
var x = y = 20; // global y is overridden
}
z();
console.log(y); // value is 20
x将在本地提升,但y不会在本地提升,因为它未被声明,因此它会泄漏到分配给10的全局范围。全局范围在本地更改为20.这就是为什么你是得到10.