2017-11-10 6 views
0

z()実行コンテキストがグローバルx変数をオーバーライドしないのはなぜですか?JavaScript実行コンテキストのスコープ

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. 

z()x = x = 20xローカルx変数をオーバーライドそれでもxのグローバル値が10あるグローバルであることを意味します。

+0

インタプリタがあなたの表現を順不同で評価するJavaScriptへようこそ。 –

答えて

1
var x = x = 20; 

var x; 
x = (x = 20); 

ので、グローバルxが指摘されていないと解釈されます。原因hoisting

3
function z(){ 
    var x = x = 20; 
} 

、これを効果的になってます。だから、その関数のxのすべてのインスタンスは、グローバル変数、ローカル変数にない参照している

function z(){ 
    var x; 
    x = x = 20; 
} 

0
var x = 10; 
function z(){ 
    var x = x = 20; 
} 
z(); 
console.log(x) 

ローカルの最初のx。 2番目の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が局所的に掲揚され、それが宣言されていないので、それが局所的に変化してしまった10のグローバルスコープが割り当てられているグローバルスコープに漏れるので、yは局所ホイストませんだからあなたが10になっているのです。

関連する問題