javascript回调函数的参数

时间:2012-07-06 14:17:59

标签: javascript callback arguments

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);
}

我希望在2000毫秒的偏移处获得printStuff('foo'),在4000毫秒的偏移处获得printStuff('bar'),但它会两次打印“bar”。我不知道发生了什么事,请帮忙。

3 个答案:

答案 0 :(得分:3)

这样做:

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

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

答案 1 :(得分:2)

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

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

在需要oldIE支持的情况下为所有人提供垫片:

forEach

bind

答案 2 :(得分:0)

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