2016-05-31 13 views
2

最近question I was looking atで次のようになりました。なぜvar nameconst nameがさまざまな出力を提供するのか不思議です。下のスニペットを実行して、私の言いたいことを見てください。const vs varとwindow.nameプロパティ

それはnamewindowオブジェクトのプロパティであることとは何かを持っている場合は、再宣言/ constnameを定義することは、私が思うだろうエラーになるはずです。ただし、以下の例では、constnameを配列として再宣言できますが、varは再宣言できません。

var name = ['one', 'two', 'three', 'four', 'five']; 
 
for (var i=0; i < name.length; i++){ 
 
    document.write(name[i] + '<br>'); 
 
}

const name = ['one', 'two', 'three', 'four', 'five']; 
 
for (var i=0; i < name.length; i++){ 
 
    document.write(name[i] + '<br>'); 
 
}

は、なぜconstハイジャックwindow.name財産に私を許可し、配列として再割り当てしますか?ただし、varは再割り当てを許可していません(デフォルトのままのままです)。string?それとも、私は単にそれを間違った方法で見ていますか?

答えて

4

constのように、letlexically scopedであり、トップレベルのレキシカルスコープはグローバルスコープと同じではありません。ここにアナロジーです:

function f(){ 
    var name = 1; 
    { 
    var name = 2; // does not create a new variable, because name already exists at the top level of the function 
    } 
    console.log(name); // 2 
} 

function g(){ 
    var name = 1; 
    { 
    const name = 2; // creates a new variable 
    } 
    console.log(name); // 1 
} 

const乗っ取りwindow.nameではありません。それはちょうどそれをシャドウしている。 2番目のケースではwindow.nameが変更されていないことを確認することでこれを確認できます。上記の関数でネストされたブロック内にあるかのようにトップレベルコードを考えることができます。var宣言はグローバルスコープに入れられますが、letconst宣言ではできません。

+1

同じ理由で 'let'は' const'のように動作することにも注意してください。 – Barmar

+0

Gotcha。私は 'let'について知っていましたが、' const'が同じ制約に従ったことに気づいていませんでした。毎日何か新しいことを学ぶ。 – Marcus

関連する問題