2016-09-05 7 views
0

JavaScriptにコードがあります。私はa[2]()を呼び出す場合機能範囲を理解する

var a = []; 

for (var i = 0; i < 5; i++) { 
    a[i] = function() { 
     alert(i); 
    }; 
} 

a[2](); 

私は2でメッセージを見ることを期待これに代えて、私は5を参照してください。

は、私はこのようにそれを書き換えることができ、それを修正するには、次の

for (var i = 0; i < 5; i++) { 
    (function (v) { 
     a[i] = function() { 
      alert(v); 
     } 
    })(i) 
} 

しかし、私はそれが動作しない方法を理解することはできません。だからなぜ私の関数コードを閉じてラップする必要がありますか?

+3

他の言語に反し、* JSでfor'文 '内には暗黙のスコープはありません。*匿名関数は、他の一方で、自分のスコープを持っており、外側の地元の人々をキャプチャし、そのため関数内にループ本体をラップし、すぐに呼び出すことで問題が解決されます。 –

+0

この場合、* i *はグローバルであることにも注意してください。 – RobG

+0

@RobG、外側の範囲に。私たちはそれが何であるかはわかりません。それはグローバルスコープでも、機能内でも、別のクロージャでもかまいません。 –

答えて

-1

クロージャ付きの自己呼び出し関数は、スコープを作成するのに適しています。

var a = []; 
 

 
for (var i = 0; i < 5; i++) { 
 
    a[i] = (function() { 
 
     var j = i; 
 
     return function() { 
 
      alert(j); 
 
     } 
 
    }(i)); 
 
} 
 

 
a[2]();

関連する問題