2016-10-07 7 views
0

これはおそらくよくある質問ですが、少なくともこの具体的な例ではありませんが、これは私が信じる共通のものです。JavaScriptスコープ

以下のコードで、なぜプログラムは3回、3回警告しますか?そして、なぜ、letが使われるとき、それはあなたが期待するようにうまくいくのですか?

letを使用すると、毎回新しい変数が参照されるか、それとも別のものが参照されるのでしょうか?謝罪これは悪い質問であれば - ちょうどそれのまわりで私の頭をラップしようとしている...

var arr = [1,2,3]; 
var o = []; 

for(var i = 0; i < arr.length; i++) { 
    var val = arr[i]; 
    o.push(function(){ alert(val); }) 
} 

o.forEach(function(func){func()}); 
+0

彼らはすべてのアラート 'val'とvalが –

+0

上書きされるので、[MDN let''上] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let) – Pointy

+0

http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue – epascarello

答えて

0

あなたが上書きval変数へのすべてのアラートリンク、。

あなたはそれがユニークなままにしたい場合は、あなたがスコープにそれを必要とする:

var arr = [1, 2, 3]; 
 
var o = []; 
 

 
for (var i = 0; i < arr.length; i++) { 
 
    //closed scope to keep VAL unique 
 
    (function() { 
 
    var val = arr[i]; 
 
    o.push(function() { 
 
     alert(val); 
 
    }) 
 
    })(); 
 
} 
 

 
o.forEach(function(func) { 
 
    func() 
 
});