
定时器 说起 JavaScript 的定时器,相信大家一定很熟悉 setTimeout 和 setInterval 。 具体功能不再重述,定时器的作用主要是做延时任务。 并且,像我们熟悉知道的编程语言, Java 、 PHP , 都包含与生俱来的多线程能力,可以同时处理多个任务。 而 JavaScript 则设计成 单线程 结合 event-loop 的异步任务调度模式。 在这种特别的设计模式下, JavaScript 不得不依赖定时器,来应对不同场景的逻辑。 阻塞 也因为 JavaScript 是 单线程 的运行环境, 同时也带来了 代码运行阻塞 的副作用。 为了解决各种各样的时序场景, 就诞生了 setTimeout(fn, 0) 这一句代码。 在阅读代码时,我们会产生非常符合人类直觉的想法: 这里的 0 ,代表浏览器在 0 毫秒后执行任务 fn 。 或者:浏览器会立即后执行任务 fn 。 当然,以上的想法是 错误 的。注意,是 错误 的。 正确的解读当然是: 任务 fn 会添加到 event-loop 的事件队列。