定时器与延时器提供了一种让一段代码在一定毫秒之后,再异步执行的能力。由于 JavaScript 单线程的特性,定时器与延时器提供了一种跳出这种限制的方法,以一种不太直观的方式来执行代码。
有一个需要理解的重要概念,就是 JavaScript 中定时器与延时器的执行时间是不能保证的,原因就是因为 JavaScript 是单线程的。JavaScript 在同一时间只能执行一个代码块,这些代码块的执行就阻塞了异步事件的处理。这意味着,当一个异步事件发生时(如鼠标单击,ajax 回调事件),它就会排队,并且在线程空闲时才进行执行。
很容易验证浏览器对定时器或延时器的阻塞,使用alert()
即可,代码很简单:
1 2 3 4 5 6 7 |
var time1 = Date.now(); alert('我正在阻塞延时器'); setTimeout(function() { var time2 = Date.now(); var timeout = (time2 - time1) / 1000 + 1; console.log('本应该 1 秒后执行,结果', timeout, '秒后才执行'); }, 1000); |