javascript如何处理while(true)-循环?

javascript如何处理while(true)-循环?,javascript,loops,browser,while-loop,Javascript,Loops,Browser,While Loop,为什么无限循环(即使插入警报并手动关闭)会导致页面冻结?它对于微控制器来说工作正常,但对于浏览器来说却不行。为什么? while(true) { alert(); } 我的理解是,当旧警报关闭时,应该会不断发出新警报。这种情况会发生一段时间,但随后浏览器冻结 是的,我知道requestAnimationFrame和setInterval的存在,但我想了解无限循环的问题所在。好了,伙计们,我在你们的帮助下找到了答案! 这里很好地描述了它: 并发模型和事件循环: 引用“运行到完成”部分:

为什么无限循环(即使插入警报并手动关闭)会导致页面冻结?它对于微控制器来说工作正常,但对于浏览器来说却不行。为什么?

while(true) {
    alert();
}
我的理解是,当旧警报关闭时,应该会不断发出新警报。这种情况会发生一段时间,但随后浏览器冻结


是的,我知道requestAnimationFrame和setInterval的存在,但我想了解无限循环的问题所在。

好了,伙计们,我在你们的帮助下找到了答案! 这里很好地描述了它:

并发模型和事件循环

引用“运行到完成”部分:


“…此模型的一个缺点是,如果消息完成时间过长,web应用程序将无法处理用户交互,如单击或滚动。浏览器通过“脚本运行时间过长”来缓解此问题。”“对话。一个好的做法是缩短消息处理时间,如果可能的话,将一条消息缩减为多条消息。”

为什么不冻结?线程正在运行循环。浏览器中的Javascript在单个线程上工作。请注意,浏览器创建了一个单独的“线程”(没有太多细节)对于像
setTimeout
或异步函数之类的函数。这意味着页面将执行while循环,直到它完成为止,因此它会冻结。为什么在一段时间后它会卡住?用于“冻结此线程的时间到了”的计时器在哪里?JS不仅在单个线程中运行,而且会发生冻结,因为HTML呈现、事件侦听和许多其他浏览器作业都使用同一个线程,当您使用无限循环保留该线程时,浏览器无法执行任何其他作业并“冻结”。“为什么一段时间后会卡住?”它一进入循环就被卡住。尽管浏览器可能需要一些时间才能意识到它实际上被卡住了。(特别是因为
alert()
是一个同步操作,它也会暂停线程,但等待警报并不意味着它被卡住。)