Javascript setTimeout问题w / for循环

时间:2011-12-19 20:27:52

标签: javascript loops for-loop settimeout

这是我的函数,当调用相关节点变为红色然后什么也不做。
这是javascript:

function blink (node, flickers)
{
    originalColour = node.style.color;
    for (i = 1; i <= (flickers*2); i++)
        {
        setTimeout (function () {ChangeColor (node, (((i%2) == 0) ? (originalColour) : ('red')))}, (i*200));
        }
}
function ChangeColor (node, color) 
{
    node.style.color = color;
}

3 个答案:

答案 0 :(得分:3)

i被调用时,

i在匿名函数被称为“i”时为“setTimeout

您需要创建一个闭包并将当前值i传递给它。

function ChangeColorLater(i) {
    return function () {
        ChangeColor (node, (((i%2) == 0) ? (originalColour) : ('red')))
    }
}

setTimeout (ChangeColourLater(i), (i*200));

答案 1 :(得分:1)

问题在于每次超时执行时,i等于闪烁* 2.

使用闭包,您可以在设置超时时捕获i的值,并将其传递给ChangeColor函数。在执行回调时,index(下面)将等于设置超时时的i值。

你想要的是:

function blink (node, flickers) {
    var originalColour = node.style.color;
    for (var i = 1; i <= (flickers*2); i++) {
        setTimeout (function (index) { // current value for i in loop becomes var index
            return function() {
                ChangeColor(node, (index % 2 == 0) ? originalColour : 'red');
            }
        }(i), i*200)
    }
}
function ChangeColor (node, color) {
    node.style.color = color;
}

答案 2 :(得分:0)

更容易阅读。 http://jsfiddle.net/wUkfe/22/

function blink(node, flickers){

  var color = node.style.color;

  (function blinker(){

    node.style.color = (flickers % 2) ?  "red" : color;

    if (flickers--){
      setTimeout(blinker, 1000);
    }

  })();

}