为什么setTimeout
在alert(2)
之后被激活,即使我将时间设置为0.我认为javascript是同步语言。
我只是想从理论上知道javascript中的异步工作方式。当javascript interpreator
遇到setTimeout
时会发生什么,当遇到其他功能时会发生什么
修改:
setTimeout(function(){
alert(0)
},0)
alert(1)
alert(2)
答案 0 :(得分:1)
JavaScript是单线程的。 JS将尝试尽可能接近提供给setTimeout函数的超时时间,但只有在线程不忙于其他事情时才会触发(例如,等待用户在警报弹出窗口中单击OK
) 。
因此,如果您有一个需要很长时间才能运行的JS脚本,并且在其中有一些具有不同超时长度的超时,它们只能在JS线程完成该脚本中的其余代码时触发。
答案 1 :(得分:1)
JavaScript使用事件循环来执行代码。该循环从队列中获取事件并执行附加到它的代码。
在您当前的活动中,您致电setTimeout
并在该队列中添加新活动。 setTimeout
调用立即返回(函数不执行,只是放入队列中)。
然后继续执行当前代码,直到完成当前事件(我假设您对alert()
的调用已在此处)。
当前事件结束后,循环从队列中选择下一个事件;这将是您使用setTimeout
设置的功能。