gpt4 book ai didi

javascript - 为什么 setTimeout 不取消我的循环?

转载 作者:IT王子 更新时间:2023-10-29 02:48:55 24 4
gpt4 key购买 nike

我想知道一个 JavaScript while 语句(在 Chrome 的控制台中)可以在一毫秒内递增一个变量多少次,所以我很快将这个片段直接写到控制台中:

var run = true, i = 0;
setTimeout(function(){ run = false; }, 1);
while(run){ i++; }

问题是它永远运行。
为什么会发生这种情况,我该如何解决?

最佳答案

这又回到了 JavaScript1 的单线程特性。发生的事情几乎是这样的:

  1. 您的变量已分配。
  2. 您安排一个函数,设置run = false。这计划在当前功能运行(或当前处于事件状态的任何其他功能)之后运行。
  3. 你有无限循环并留在当前函数中。
  4. 在无限循环(从不)之后,setTimeout() 回调将被执行并且 run=false

如您所见,setTimeout() 方法在这里不起作用。您可以通过检查 while 条件中的时间来解决这个问题,但这会篡改您的实际测量值。

1 至少出于更实际的目的,您可以将其视为单线程。实际上有一个所谓的“事件循环”。在该循环中,所有函数都会排队,直到它们被执行。如果您对一个新函数进行排队,它将被放置在该队列中的相应位置。 当前函数完成后,引擎从队列中获取下一个函数(相对于引入的计时,例如通过 setTimeout() 并执行它。
结果在每个时间点只执行一个函数,从而使执行几乎是单线程的。事件有一些异常(exception)情况,在下面的链接中进行了讨论。


供引用:

关于javascript - 为什么 setTimeout 不取消我的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21656766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com