JavaScript回调函数的参数

arguments to javascript callback function

本文关键字:参数 函数 回调 JavaScript      更新时间:2023-09-26
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"。我不知道发生了什么,请帮忙。

这样做:

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

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

您可以使用函数迭代来免费提供闭包:

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

在需要旧IE支持的情况下,适用于所有人的填充码:

对于每个

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