首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在循环中将函数传递给setTimeout :总是最后一个值吗?

在循环中将函数传递给setTimeout :总是最后一个值吗?
EN

Stack Overflow用户
提问于 2011-06-21 20:15:16
回答 4查看 14.1K关注 0票数 17

我试图使用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或全局变量情况下将字符串传递给匿名函数?

EN

回答 4

Stack Overflow用户

发布于 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;
}
票数 28
EN

Stack Overflow用户

发布于 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;
}
票数 15
EN

Stack Overflow用户

发布于 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;
}

View demo of it in action

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6425062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档