WEB开发网
开发学院网页设计JavaScript JavaScript的单线程性质以及定时器的工作原理 阅读

JavaScript的单线程性质以及定时器的工作原理

 2010-09-14 13:39:44 来源:WEB开发网   
核心提示: 我们能够发现,当第三个setInterval回调函数被触发时,JavaScript的单线程性质以及定时器的工作原理(3),之前的setInterval回调函数仍在执行,这就说明了一个很重要的事实:setInterval不会考虑当前正在执行什么,了解了JavaScript引擎是如何工作的,尤

我们能够发现,当第三个setInterval回调函数被触发时,之前的setInterval回调函数仍在执行。这就说明了一个很重要的事实:setInterval不会考虑当前正在执行什么,而把所有的堵塞的函数排到队列尾部。这意味着两次setInterval回调函数之间的时间间隔会被牺牲掉(缩减)。

最后,当第二个setInterval回调函数执行完毕后,我们可以看到没有任何程序等待JavaScript引擎执行了。这就意味着浏览器现在在等待一个新的异步事件的发生。在50ms时一个新的setInterval回调函数再次被触发,这时,没有任何的执行块阻塞它的执行了。所以它会立刻被执行。

让我们用一个例子来阐明setTimeout和setInterval之间的区别:

 setTimeout(function(){
  /* Some long block of code... */
  setTimeout(arguments.callee, 10);
 }, 10);
 
 setInterval(function(){
  /* Some long block of code... */
 }, 10);

这两句代码乍一看没什么差别,但是它们是不同的。setTimeout回调函数的执行和上一次执行之间的间隔至少有10ms(可能会更多,但不会少于10ms),而setInterval的回调函数将尝试每隔10ms执行一次,不论上次是否执行完毕。

在这里我们学到了很多知识,总结一下:

JavaScript引擎是单线程的,强制所有的异步事件排队等待执行

setTimeout 和 setInterval 在执行异步代码的时候有着根本的不同

如果一个计时器被阻塞而不能立即执行,它将延迟执行直到下一次可能执行的时间点才被执行(比期望的时间间隔要长些)

如果setInterval回调函数的执行时间将足够长(比指定的时间间隔长),它们将连续执行并且彼此之间没有时间间隔。

上述这些知识点都是非常重要的。了解了JavaScript引擎是如何工作的,尤其是大量的异步事件(连续)发生时,才能为构建高级应用程序打好基础。

上一页  1 2 3 

Tags:JavaScript 线程 性质

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接