为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2019-08-19 16:04:18
将函数传递给循环中的setTimeout:总是最后一个值?我正在尝试使用setTimeout来执行我传递信息的匿名函数,我遇到了麻烦。这个(硬编码版本)可以正常工作:setTimeout(function(){alert("hello");},1000);setTimeout(function(){alert("world");},2000);但是我试图从数组中取出hello和world并将它们传递给函数,而不是(a)使用全局变量,以及(2)使用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;}当然,字符串[i]将脱离上下文。如何在没有eval或globals的情况下将字符串[i]传递给该匿名函数?
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这是经常重复的“如何在闭包中使用循环变量”问题。

规范的解决方案是调用一个函数,该函数返回一个绑定到循环变量当前值的函数:

var strings = [ "hello", "world" ];var delay = 1000;for(var i=0;i<strings.length;i++) {
    setTimeout(
        (function(s) {
            return function() {
                alert(s);
            }
        })(strings[i]), delay);
    delay += 1000;}

外部定义function(s) { ... }创建一个新的作用域,其中s绑定到所提供参数的当前值 - 即strings[i]内部作用域可用的位置。


查看完整回答
反对 回复 2019-08-19
?
撒科打诨

TA贡献1934条经验 获得超2个赞

只需在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;}


查看完整回答
反对 回复 2019-08-19
?
三国纷争

TA贡献1804条经验 获得超7个赞

您可以编写一个单独的函数来设置超时:

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;}


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 435 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信