2011-08-17 4 views

答えて

6

JavaScript(よくECMAScript)にブロックスコープ(yet)がないため。機能範囲のみ。

実際に関数の先頭に1つの変数宣言があるため、は初期値の1を上書きしています。

function t() 
{ 
    var x = 1; 

     // v---------immediately invoked function to create a new scope 
    (function() { 
      // new variable scope 
     if(true) 
     { 
      var x = 2; 
      alert(x); // 2 
     } 
    })(); 

    alert(x); // 1 
} 
t(); 
+0

非常に楽観的ではない「まだ」。私はこれが変わることはないと思う。何十年ものコードを破るという悪夢を想像してみてください。編集:私は修正した、あなたの編集リンクは私が考慮しなかったいくつかの追加の洞察力を提供します。 –

+1

@Anthony:コードがブラウザで実行されている場合、非常に真です。自立したJSエンジンのブラウザからは、楽観的な理由があります(または今日でも楽しむことさえあります)。 :o) – user113716

1

JavaScriptの変数は、ブロックではなく機能に限定されます。 varが2つありますが、実際にはxが1つのみです。あなたが持っているコードはこれに同じように動作しますので、

3

「VAR」キーワードは、全体関数内で適用されます。

function t() { 
    var x = 1; 
    if (true) { 
     x = 2; 
     alert(x); 
    } 
    alert(x); 
} 
t(); 
関連する問題