JavaScript回调函数的参数
arguments to javascript callback function
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
数组中的第二个对象。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 函数未将值作为参数传递
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 为什么不'我们在javascript中使用函数参数的数据类型
- 你好,这是测试用例,我必须在函数中传递n个参数
- JavaScript - 多参数函数,它是多个图像库的字符串
- 如何从两个参数函数返回随机整数
- 以无点风格在Ramda中编写一个无参数函数
- JS:将单参数函数转换为可链接函数
- 正则表达式类似于Javascript中的参数函数
- 将 $' 值传递给替换的关联参数函数
- "这个“;在参数函数中
- 如何向jquery插件发送参数函数
- 将参数函数Node.js从一个js传递到另一个js
- 如何在javascript参数函数中传递PHP post方法字符串
- 装饰 Javascript Promise.then 以便参数函数接收附加参数
- 正在分析setInterval ID'是的's参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆