Skip to content

高级技巧

高级定时器

使用 setTimeout() 和 setInterval() 创建的定时器可以用于实现有趣且有用的功能

虽然人们对 JavaScript 的定时器存在普遍的误解,认为它们是线程,其实 JavaScript 是运行于单线程的环境中的,而定时器仅仅只是计划代码在未来的某个时间执行。

执行时机是不能保证的,因为在页面的生命周期中,不同时间可能有其他代码在控制 JavaScript 进行。
在页面下载完后的代码运行、事件处理程序、Ajax 回调函数都必须使用同样的线程来执行。
实际上,浏览器负责进行排序,指派某段代码在某个时间点运行的优先级

可以把 JavaScript 想象成在时间线上运行的。
当页面载入时,首先执行是任何包含在 <script>元素中的代码,通常是页面生命周期后面要用到的一些简单的函数和变量的声明,不过有时候也包含一些初始数据的处理。

在这之后,JavaScript 进程将等待更多代码执行。
当进程空闲的时候,下一个代码会被触发并立刻执行。
例如,当点击某个按钮时,onclick 事件处理程序会立刻执行,只要 JavaScript 进程处于空闲状态。

除了主 JavaScript 执行进程外,还有一个需要在进程下一次空闲时执行的代码队列。
随着页面在其声明周期中的推移,代码会按照执行顺序添加入队列。

例如,当某个按钮被按下时,它的事件处理程序代码就会被添加到队列中,并在下一个可能的时间里执行

当接收到某个 Ajax 响应时,回调函数的代码会被添加到队列。
在 JavaScript 中没有任何代码是立刻执行的,但一旦进程空闲则尽快执行