gpt4 book ai didi

javascript - 为什么在有 setTimeout 和 setInterval 的情况下,javascript 中没有 sleep 功能?

转载 作者:数据小太阳 更新时间:2023-10-29 05:47:14 25 4
gpt4 key购买 nike

为什么 javascript 中没有这样的函数为其继续设置超时、保存必要的状态(作用域对象和执行点)、终止脚本并将控制权交还给浏览器? 在超时到期后,浏览器将加载回执行上下文并继续执行脚本,我们将拥有一个真正的非浏览器阻塞 sleep 功能,即使 JS 引擎是单线程的也可以工作。

为什么在javascript中仍然没有这样的功能?为什么我们仍然必须将我们的代码切片为函数并将超时设置到下一步以实现 sleep 效果?

最佳答案

我认为您不希望浏览器中出现“ sleep ”。

首先,您可能不清楚在您实际休眠时会发生什么以及浏览器应该如何表现。

  • 完整的脚本运行时是否正在休眠?通常它应该是因为你只有一个线程运行你的代码。那么如果在 sleep 期间发生其他事件会怎样呢?他们会阻塞,并且一旦执行继续,所有被阻塞的事件都会触发。正如您想象的那样,这将导致奇怪的行为(例如,鼠标点击事件在实际点击后的某个时间触发,可能是几秒钟)。或者必须忽略这些事件,这将导致信息丢失。

  • 您的浏览器会怎样?如果用户单击(例如关闭窗口)按钮,它会等待 sleep 吗?我认为不会,但这实际上可能会再次调用 javascript 代码(卸载),由于程序执行正在休眠,因此将无法调用。

转念一想, sleep 是程序设计不佳的标志。实际上一个程序/功能/你的名字有一个特定的任务,应该尽快完成。有时您必须等待结果(例如您等待 XHR 完成)并且您希望同时继续执行程序。在这种情况下,您可以而且应该使用异步调用。这带来了两个优势:

  • 所有脚本的速度都提高了(不会因为 sleep 而阻塞其他脚本)
  • 代码准确地在应该执行的时间执行,而不是在某个事件之前或之后执行(如果两个函数检查相同的条件,这可能会导致其他问题,例如死锁......)

...这会导致另一个问题:想象一下,有两段或更多段代码会调用 sleep。如果他们试图同时 sleep ,他们会阻碍自己,也许是不必要的。当你想调试时,这会造成很多麻烦,你甚至可能难以确保哪个函数先休眠,因为你可能以某种方式控制这种行为。

嗯,我认为这是 Javascript 的优点之一, sleep 不存在。然而,多线程 javascript 如何在浏览器中执行可能会很有趣;)

关于javascript - 为什么在有 setTimeout 和 setInterval 的情况下,javascript 中没有 sleep 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5832276/

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