为什么有setTimeout和setInterval时javascript中没有睡眠功能?

Cal*_*ius 5 javascript browser language-design

为什么javascript中没有这样的函数为其继续设置超时,保存必要的状态(范围对象和执行点),终止脚本并将控件返回给浏览器?超时到期后,浏览器将加载执行上下文并继续执行脚本,即使JS引擎是单线程的,我们也会有一个真正的非浏览器阻塞睡眠功能.

为什么javascript中仍然没有这样的功能?为什么我们仍然需要将代码切分为函数并将超时设置为下一步以实现睡眠效果?

Ale*_*lex 5

我认为'睡眠'是你在浏览器中不想要的东西.

首先,可能不清楚什么必须发生以及浏览器在您实际入睡时应该如何表现.

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

  • 您的浏览器会发生什么?如果用户点击(例如关闭窗口)按钮,它应该等待睡眠吗?我想不是,但这实际上可能会再次调用javascript代码(卸载),因为程序执行正在休眠,所以无法调用它.

再想一想,睡眠是程序设计不佳的标志.实际上一个程序/功能/你命名它有一定的任务,应尽快完成.有时您必须等待结果(例如,您等待XHR完成)并且您希望同时继续执行程序.在这种情况下,您可以并且应该使用异步调用.这带来两个好处:

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

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

我认为它是Javascript的优点之一,睡眠不存在.然而,多线程javascripts如何在浏览器中执行可能会很有趣;)

  • 要么我不理解你的观点,要么你不理解我的观点.:) SetTimeout设置在指定时间后执行的函数.sleep函数会告诉浏览器在这里终止脚本并在指定的时间后跳回到下一个语句.这将涉及保存堆栈跟踪和范围对象,但基本上与setTimeout函数相同.因此它不会睡眠整个浏览器.在睡觉期间,其他事件可以触发并且可以处理.它不会是多线程的. (2认同)