当前位置: 首页 > 面试题库 >

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

齐文栋
2023-03-14
问题内容

我正在尝试使用setTimeout执行匿名函数,该函数会将信息传递给我,但出现了问题。这个(硬编码版本)可以正常工作:

setTimeout(function(){alert("hello");},1000);
setTimeout(function(){alert("world");},2000);

但是我试图从数组中获取hello和world并将其传递给函数,而无需(a)使用全局变量,以及(2)使用eval。我知道如何使用globals或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]传递给该匿名函数?


问题答案:

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

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

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]可用的范围。 __



 类似资料:
  • 问题内容: 我尝试了以下失败的尝试: 在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数? 问题答案: 用于对in函数具有相同的访问权,如下所示:

  • 问题内容: 我想将传递给function()的所有参数作为参数传递给内部的另一个function(), 这可以在被调用过程中完成并将它们传递给,但是还有另一种方法吗? 本来 但是如果我的func1签名是 我如何将它们全部发送到func2,而不使用 有没有一种方法像在javascript中? 问题答案: 显式比隐式更好, 但是如果您真的不想键入一些字符,请执行以下操作: 都是局部变量,因此您不能在调

  • 问题内容: 只是一个关于如何在Java中传递参数的快速问题… 在这种情况下,stdout和stderr(用作tidy()中的参数)的值是否会更改为新的StringBuffer(buffer.substring(i))?我的假设是,它们将作为对象变量(对象指针)始终按值传递吗? 问题答案: 您错报了这里发生的事情-对象引用按值传递(创建了引用的副本),因此调用tidy时 不会 修改stdout和st

  • 问题内容: 是否可以通过某种方式将一个函数的范围传递给另一个函数? 例如, 我宁愿直接访问变量,即,不使用类似或的任何东西,而只是直接使用或。 问题答案: 真正访问函数私有范围的唯一方法是在函数内部声明,这样就形成了一个闭包,允许隐式访问变量。 这是您的一些选择。 直接访问 在内部声明。 如果您不想在中使用,则可以将它们都放在更大的容器范围内: 这些是您可以直接使用的变量而无需任何额外的代码来移动

  • 你好,亲爱的堆栈溢出,我刚刚启动了一个盖茨比网站,但我有通过传递给组件的数组循环的问题。 我有一个叫博客的盖茨比网页。js,在这个页面中,我展示了通过GraphQL检索到的博客标题。直接在博客中使用循环。我可以看到所有的标题。 我的blog.js圈是这样的 它从以下GraphQL查询中检索数据 而不是在博客中创建博客帖子预览。相反,我想使用一个组件来实现这一点。我创建了一个名为BlogPostRe

  • 问题内容: 我有一些如下的JavaScript代码: 我收到未定义的错误,在使用该功能之前,一切都在工作。 我希望一段时间后调用我的函数。我该怎么办? 问题答案: setTimeout(function() { postinsql(topicId); }, 4000) 您需要将匿名函数作为参数而不是字符串作为参数,后一种方法甚至不符合ECMAScript规范,但浏览器比较宽松。这是正确的解决方案,