它與i
變量的範圍有關。它綁定到for循環,而不是由setTimeout調用的函數。基本上,當調用延遲函數時,i
已經增加到4.爲了綁定當前循環值i
,調用另一個函數。 i
被放置在函數堆棧上,因此如果被保存則值。
這取決於你在尋找什麼樣的行爲,但是如果你想一次改變所有元素的CSS @Josh的評論是最好的。
$("#button").click(function() {
setTimeout(function(){
for (var i = 0; i < 4; i++) {
$(".rows:eq("+i+")").css("background-color", "blue");
}
,500);
});
否則嘗試:
bindItoFunc = function (i) {
return function(){
$(".rows:eq("+i+")").css("background-color", "blue");
};
}
$("#button").click(function() {
for (var i = 0; i < 4; i++) {
setTimeout(bindItoFunc(i),500);
}
});
也許更優雅的解決方案是結合i
作爲函數的this
值。
bindItoFunc = function() {
$(".rows:eq("+this+")").css("background-color", "blue");
}
$("#button").click(function() {
for (var i = 0; i < 4; i++) {
setTimeout(bindItoFunc.bind(i),500);
}
});
提問者表示背景應該按順序改變。在這種情況下,請根據i
更改waitMs。
bindItoFunc = function() {
$(".rows:eq("+this+")").css("background-color", "blue");
}
$("#button").click(function() {
for (var i = 0; i < 4; i++) {
setTimeout(bindItoFunc.bind(i),500+(100*i));
}
});
小心把HTML – jstuartmilne
當你的第一個超時功能已經執行,'i'已經增加到4.把'for'循環放入超時函數。 –
您需要使用閉包器 –