在javascript执行上下文中确定范围

时间:2017-11-10 18:51:56

标签: javascript

为什么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;

这意味着bc被声明为全局变量,而不是预期的本地变量。

例如:

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}}。

3 个答案:

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