我试图使用setTimeout执行一个匿名函数,我将信息传递给该函数,但遇到了问题。这个(硬编码版本)将工作得很好:
setTimeout(function(){alert("hello");},1000);
setTimeout(function(){alert("world");},2000);
但我尝试从数组中获取hello和world,并将它们传递到函数中,而不是(a)使用全局变量,(2)使用eval。我知道如何使用全局变量或eval来做这件事,但是没有全局变量或eval,我怎么做呢?这是我想要做的(但我知道它不会起作用):
var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
setTimeout( function(){alert(strings[i]);}, delay);
delay += 1000;
}
当然,stringsi会断章取义。如何在不使用eval或全局变量情况下将字符串传递给匿名函数?
发布于 2011-06-21 20:19:37
只需在setTimeout调用周围添加一个作用域:
var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
(function(s){
setTimeout( function(){alert(s);}, delay);
})(strings[i]);
delay += 1000;
}
发布于 2011-06-21 20:17:40
您可以编写一个单独的函数来设置超时:
function doTimer(str, delay) {
setTimeout(function() { alert(str); }, delay);
}
然后从循环中调用它:
var delay = 1000;
for(var i=0;i<strings.length;i++) {
doTimer(strings[i], delay);
delay += 1000;
}
发布于 2013-07-17 05:40:07
虽然不像其他一些答案那样向后兼容,但我想我会抛出另一个选择。这一次使用bind()!
var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
setTimeout(alert.bind(this, strings[i]), delay);
delay += 1000;
}
https://stackoverflow.com/questions/6425062
复制相似问题