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

JavaScriptfor循环中的setTimeout不打印连续值

桂智志
2023-03-14
问题内容

我有这个脚本

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}

3被警告两次,而不是1那么2

有没有一种方法可以传递i而不将函数编写为字符串?


问题答案:

您必须为每个超时功能安排一个单独的“ i”副本。

function doSetTimeout(i) {
  setTimeout(function() { alert(i); }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);

如果您不做这样的事情(同一想法还有其他变体),那么每个计时器处理程序函数将 共享 相同的变量“ i”。循环结束后,“
i”的值是多少?3!通过使用中间函数,将 复制 变量的值。由于超时处理程序是在该副本的上下文中创建的,因此它具有自己的专用“ i”。

编辑 -随着时间的流逝,出现了一些评论,由于设置了一些超时会导致处理程序同时执行所有操作,因此有些混乱显而易见。重要的是要了解, 设置
计时器的过程-
调用setTimeout()-几乎不需要时间。也就是说,告诉系统“请在1000毫秒后调用此函数”将几乎立即返回,因为在计时器队列中安装超时请求的过程非常快。

因此,如果进行了 一系列
超时请求(如OP中的代码和我的答案中的情况),并且每个时间延迟值都相同,那么一旦经过该时间量,所有计时器处理程序会迅速相继被称为。

如果您需要按间隔调用处理程序,则可以使用setInterval(),它的调用方式与完全相同,setTimeout()但是在重复请求数量的延迟后将触发多次,或者您可以建立超时并乘以时间您的迭代计数器的价值。也就是说,修改我的示例代码:

function doScaledTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, i * 5000);
}

(在100毫秒级的时间内,效果不会很明显,因此我将该数字提高到5000。)将的值i乘以基本延迟值,因此在循环中调用5次将导致5次延迟。秒,10秒,15秒,20秒和25秒。

更新资料

在2018年,这里有一个更简单的选择。由于具有在比函数更狭窄的范围内声明变量的新功能,因此,如果修改了原始代码,则可以工作:

for (let i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}

let声明不同var,声明本身会导致i循环的每次迭代都具有不同的内容。



 类似资料:
  • 下面三段代码的输出结果不同,前端初学者想请问一下背后的原因是什么(学不明白)

  • 问题内容: 我对工作方式有些困惑。我正在尝试在循环中添加一个,以便循环迭代之间相距1秒。每次循环迭代都会发出一个HTTP请求,而另一端的服务器似乎无法在这么短的时间内处理那么多请求。 为什么这不起作用,我如何实现呢? 谢谢 问题答案: 你需要这样的东西 另请参阅此小提琴 此时,您可以致电服务器。请注意,计数器的工作方向相反(递减计数)。我更新了一些注释,说明在哪里可以做您的事情。

  • 我想做的是制作一个快速而肮脏的幻灯片。我的想法是让master div包含一个空白的“master”img标记和一组div,每个div都包含自己的img和span标记。每个图像的源依次设置为主img的源。因此,我开始迭代每个图像,并尝试使用setTimeout()和2秒延迟将其源设置为主img的源。我遇到的问题是,编写代码似乎要等待两秒钟,并且只显示序列中的最后一幅图像。 如果我能得到第二双眼睛来

  • 我有一个无向图,它被加载为邻接矩阵。我有一个使用BFS算法检测图中循环的方法。我试图实现的是打印所有的边缘,以一种方式,他们表明一个循环,已经找到。 我可以打印一个图形中的所有边,但我不能只打印那些创建循环的边。我怎么让它工作? 边缘: 图表: 节点: 当前错误输出:显示一个周期的部分边沿,但不是全部边沿 预期输出:打印创建循环的所有边,如上面的示例所示, 我想显示:一条边的结束顶点是循环中另一条

  • 问题内容: 专家。JavaScript无法产生所需的延迟效果。 从其他问题上,我因此知道,问题在于settimeout及其使用方式。但是我仍然无法理解Settimeout的工作原理。所以我将代码放在这里。由于知识目的,仅需使用Javascript。 实际上,我正在尝试清除有关 此的 概念,即javascript中的 闭包 。它们是Java的扭曲事物吗? 问题答案: 您有两个问题: 调用回调时将具有

  • 问题内容: 嗨,我被困在我的setTimeout函数上。我想做的是为我的检索对话功能循环setTimeout。我已经在setInterval上尝试过,但是对我的应用程序使用setInterval是一个坏消息,这就是为什么我切换到setTimeout的原因。但是我似乎无法弄清楚加载完成后如何使setTimeout再次工作..这是我到目前为止已经尝试过的事情,但现在仍在尝试使其工作.. Javascr