2
var data = [{offset: 2000, str:'foo'}, {offset: 4000, str:'bar'}];

for (var i=0; i<data.length; i++) {
    var x = data[i];
    setTimeout(function(){printStuff(x.str)}, x.offset);
}

function printStuff(str) {
    console.log(str);
}

我期望得到printStuff('foo')2000 毫秒的偏移量和printStuff('bar')4000 毫秒的偏移量,但它两次都打印“条形图”。我不知道发生了什么,请帮忙。

4

3 回答 3

3

做这个 :

for (var i = 0; i < data.length; i++) {
    (function (x) {
        setTimeout(function () {
            printStuff(x.str)
        }, x.offset);
    })(data[i]);
}

您的问题是调用函数时 x 在闭包中发生了变化。

于 2012-07-06T14:19:52.063 回答
2

您可以使用免费提供闭包的功能迭代:

data.forEach( function( x ) {
      setTimeout( printStuff.bind(null, x.str), x.offset );
});

如果需要 oldIE 支持,则适用于所有人的垫片:

为每个

绑定

于 2012-07-06T14:24:03.560 回答
0

setTimeout不会阻止代码继续执行,因此循环完成,到执行setTimeout回调时,'x' 的最新值是data数组中的第二个对象。

于 2012-07-06T14:24:08.070 回答