2016-10-07 105 views
0

這可能是,也可能是一個常見問題,但我找不到答案,至少不是這個具體的例子 - 這是我相信的一個常見問題。JavaScript範圍

在下面的代碼中,爲什麼程序會提醒3次,3次?爲什麼當使用它時,它是否像你期望的那樣工作?

是因爲當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() 
 
});