Javascript 如何将变量传递给setTimeout函数?
我试图设置五个交错的函数调用(间隔一秒钟)。那部分很好用。不起作用的是,我不能将值0到4传递给回调函数。每次只经过“5”。我似乎不明白为什么以及如何修复它 代码: 预期结果:Javascript 如何将变量传递给setTimeout函数?,javascript,Javascript,我试图设置五个交错的函数调用(间隔一秒钟)。那部分很好用。不起作用的是,我不能将值0到4传递给回调函数。每次只经过“5”。我似乎不明白为什么以及如何修复它 代码: 预期结果: 0 1 2 3 4 使用lambda/函数表达式捕获当前值。比如说 for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000) { var doCall = function (j) { setTimeout(function()
0
1
2
3
4
使用lambda/函数表达式捕获当前值。比如说
for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000) {
var doCall = function (j) {
setTimeout(function() { callback(j); }, loadDelay);
}
doCall(i);
}
我的解决方案之所以有效,是因为它引入了一个新函数,从而为
j
引入了一个新的变量生存期。这将在函数中保存i
的当前值,以便在setTimeout
回调中使用setTimeout会产生一些奇怪的范围问题。旨在解决此类困惑,这也有效[更新]:
function callback(num) {
console.log(num);
}
for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000) {
Frame(function(next, i){
setTimeout(function() { callback(i); }, loadDelay);
next();
}, i);
}
Frame.init();
函数回调(num){
console.log(num);
}
对于(变量i=0,加载延迟=1000;i<5;++i,加载延迟+=1000){
框架(功能(下一步,i){
setTimeout(函数(){callback(i);},loadDelay);
next();
},i);
}
Frame.init();
由于变量作用域,您需要一个闭包才能通过i
。请查看,并获取有关闭包的一些好信息
function callback(num)
{
console.log(num);
}
for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000)
setTimeout((function(num){return function(){
callback(num);
}
})(i), loadDelay);
函数回调(num)
{
console.log(num);
}
对于(变量i=0,加载延迟=1000;i<5;++i,加载延迟+=1000)
setTimeout((函数(num){return函数(){
回调(num);
}
})(i) ,装载延迟);
这是因为您创建了一个闭包。因此,传递给setTimeout
的函数共享相同的i
实例。在支持标准(非IE)的浏览器中,您可以:
setTimeout(callback, loadDelay, i);
见:
否则,您必须实际将参数绑定到函数:
setTimeout(callback.bind(undefined, i), loadDelay);
见:
如果浏览器不支持ES5bind
方法,则可以实现上面链接中的垫片,或者手动执行以下操作:
setTimeout(function(index){
return function() { callback(index) }
}(i), loadDelay);
但是我要说的是,使用bind
更具可读性,而且实现垫片是值得的。实际上,您可以使用:
在本机不支持es5的浏览器中添加es5功能(如果可能)。增加回调中的值。由于setTimeout是异步的,这就是为什么您总是使用5。太好了!漂亮&短,优雅。适用于Firefox和Chrome。
setTimeout(callback, loadDelay, i);
setTimeout(callback.bind(undefined, i), loadDelay);
setTimeout(function(index){
return function() { callback(index) }
}(i), loadDelay);