您现在的位置是:首页 > 文章详情

阅读《深入理解JavaScript定时机制》

日期:2018-01-06点击:514

鸟哥的这篇《深入理解JavaScript定时机制》从javascript线程角度分析了setTimeout和setInterval两个定时触发器的实现原理。

看完的体验就是主要要记住两点:

javascript的引擎是单线程的

javascript的引擎是基于事件驱动的

setTimeout和setInterval都是往事件队列中增加一个待处理事件而已。setTimeout是触发一次,而setInterval是循环触发。

但是

想要使用setTimeout循环触发

可以这样做:

1
2
3
4
setTimeout( function () {
         /* 代码块... */
         setTimeout(arguments.callee, 10);
}, 10);

这个看起来和

1
2
3
setInterval( function (){
         /*代码块... */
}, 10);

但是上一份代码中,是执行完了代码块,才挂起来这个事件,所以两次执行时间会大于10,而第二份代码,是自动在10的时候挂上这个事件,所以两次事件相隔的时间会小于等于10(这个说法还是有点憋屈。。。)

但是要明确:

当线程阻塞在一个事件的时候,不管是使用setInterval还是setTimeout都需要等待当前事件处理完才能执行。

比如下面例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
 
function  sleep(d){
     document.write( Date .now() + "<br>" );
     for ( var  t = Date .now(); Date .now() - t <= d;) {
 
     }
}
 
setInterval( function () {
     sleep(9123)
}, 1000);
 
</script>

它不会是1s打印一次,而是大约9s才打印一次,这就是由于线程被阻塞在for循环中了。



本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3469820.html,如需转载请自行联系原作者

原文链接:https://yq.aliyun.com/articles/336634
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章