前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS中setTimeout是如何实现的

JS中setTimeout是如何实现的

作者头像
dys
发布2018-04-02 17:36:59
3.3K0
发布2018-04-02 17:36:59
举报
文章被收录于专栏:性能与架构性能与架构

我们知道 Javascript引擎是单线程的,而setTimeout方法的作用是延后执行目标代码,同时还可以继续往下执行

setTimeout是如何实现的?

这涉及到了浏览器内核的事件循环模型,在Javascript引擎之外,有一个任务队列,当执行到setTimeout时,延时方法会交给内核其他模块处理(与执行引擎主线程独立),当延时方法到达触发条件,这一延时方法被添加至任务队列里,执行引擎在主线程方法执行完毕后,会从任务队列中顺序获取任务来执行,这一过程是一个不断循环的过程,称为事件循环模型

下面通过一段示例代码,看一下整个执行过程

代码语言:javascript
复制
console.log('1');
setTimeout(function test(){
  console.log('2');
},5000);
console.log('3');

执行过程

(1)log('1')入栈执行

(2)setTimeout test入栈执行 交由webapis处理

(3)log('3')入栈执行

(4)在setTimeout方法执行5秒后,timer模块检测到延时处理方法到达触发条件,于是将延时处理方法加入任务队列

(5)执行引擎的执行栈为空后,引擎开始轮询检查任务队列是否有任务需要被执行,就检查到延时方法test,于是将延时方法加入执行栈,test方法调用了log()方法,于是又将log(2)方法入栈执行,输出2,之后清空执行栈

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档