如何使此javascript警報0,1和2而不是3 3?如何使用本地參數進行匿名函數
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
window.setTimeout(function() {alert(i);}, 1000);
}
我知道爲什麼它這樣做的原因,但我無法弄清楚,如何通過i
匿名函數。
如何使此javascript警報0,1和2而不是3 3?如何使用本地參數進行匿名函數
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
window.setTimeout(function() {alert(i);}, 1000);
}
我知道爲什麼它這樣做的原因,但我無法弄清楚,如何通過i
匿名函數。
您可以像這樣在一個封閉包裝這個:
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
(function(num) {
window.setTimeout(function() {alert(vals[num]);}, 1000);
})(i);
}
var vals = [1, 2, 3];
function makeCallback(i)
{
return function() {alert(i);};
}
for(var i = 0; i < vals.length; i++)
{
window.setTimeout(makeCallback(i), 1000);
}
IT工作,但不是有效的語法'window.setTimeout'需要一個函數參考,不執行代碼。 – Tyilo
你甚至不需要返回一個函數,看起來 - 只需發出警報(i)'在makeCallback內部 – Blazemonger
試試吧。 makeCallback返回一個函數引用,所以它會工作。 –
這不是絕對必要的,以我傳遞給函數,它可以被分配給本地var內部。
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
(function() {
var num = i
window.setTimeout(function() {alert(vals[num]);}, 1000);
})();
}
「function(){block}()」是必需的,因爲Javascript沒有合適的塊詞法變量。最近的版本增加了「讓」,這使這成爲可能:
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++) {
let num = i
window.setTimeout(function() {alert(vals[num]);}, 1000);
}
不錯的工作。我注意到,有時候這些數字會按照1,3,2的順序發出警報(可能是Chrome 13中運行它的5次之一) –
順序無關緊要,您不應該依賴setTimeout的順序或者無論如何setInterval – Tyilo