近期在复习JavaScript,看到setTimeout函数时。想起曾经刚学时,在一本书上看过setTimeout()里的回调函数执行的间隔时间有昌不是后面设置的值。曾经没想太多。网上看了JS大神的解释,整理记录下JavaScript引擎的内部执行机制。

首先看一段小程序:

<script>
alert('第1');
setTimeout(function(){alert('第2');}, 2000);
alert('第3');
</script>

输出顺序是:第1。第3,第2;再来看一段小程序:

<script>
alert('第1');
setTimeout(function(){alert('第2')}, 0);
alert('第3');
</script>

输出顺序还是:第1,第3,第2。为什么不是第1,第2,第3。setTimeout的间隔时间设置为0不就是马上执行吗?在此引出JavaScript的执行机制:Event
Loop(貌似译为事件轮询)。

JavaScript的任务队列

由于JavaScript是单线程的。全部的任务仅仅能是一个接一个的运行,可是当遇像IO这种读取一些大文件时就会出现后一个任务长时间处于等待状态。要等到前一个任务运行完才干開始后一个任务。

由于这样。JavaScript也设计为主线程能够先无论IO设备,先运行后面的任务,等IO设备返回了结果。再回去继续运行。

因此。在JavaScript中,全部的任务能够分为两种:一是同步任务(synchronous);二是异步任务(asynchronous)。

同步任务就是:在主线程上。必须等前一个任务运行完。才干运行后一个任务;异步任务则是:不进入主线程。而是进入“任务队列”(task
queue)的任务,主线程仅仅有在得到“任务队列”的通知。某个异步任务能够运行,该异步任务才会进入主线程运行。

事实上“任务队列”就是一个事件的队列。主线程读取“任务队列”,就是读取里面的事件。这些事件一般包含IO设备的事件、点击、滚动事件,凡是指定过回调函数(callback)。这些事件发生时就会进入“任务队列”。异步任务必须指定回调函数。主线程运行异步任务,就是运行相应的回调函数。

oText.innerText = '...';

比方在某一页面中。运行了上面这一代码后。DOM的内容会发生改变,接着系统触发DOM Changed事件,产生异步回调。回调函数被加入到“任务队列”中。

Event
Loop

1.同步任务在主线程上运行会形成一个“运行栈”(execution context stack);

2.异步任务在“任务队列”里有执行结果就会在“任务队列”里置一事件(Event)。

3.当“运行栈”中的同步任务都运行完后。“任务队列”中有运行结果(事件,比方:Mouse Clicks、Key Presses、定时事件等)的异步任务就会进入“运行栈”,開始运行;

主线程从“任务队列”读取事件的过程是不断循环的,这样的机制就称为Event Loop。

Event Loop图解:

仅仅有“运行栈”中任务运行完了,就会去读取“任务队列”,运行各事件相相应的回调函数。

如今应该明确开篇中,为什么setTimeout的间隔时间设置为0却最后运行了吧,由于要等“运行栈”中的代码运行完后,才会去运行“任务队列”中的回调函数。

Author:顾故

Sign:别输给以前的自己

最新文章

  1. 两段for循环代码的区别
  2. canvas drag 实现拖拽拼图小游戏
  3. git初体验(五)SSH的理解
  4. js实现复制功能
  5. C#Winform版获取Excel文件的内容
  6. 网页a标签:导航制作 怎么让鼠标经过A标签的时候显示块状背景?
  7. JMeter一个错误the target server failed to respond--JMeter坑
  8. svg动画学习
  9. 轻松学JVM(二)&mdash;&mdash;内存模型、可见性、指令重排序
  10. Linux--主从复制
  11. ural1018依赖背包-边权
  12. sublime text3作为php开发IDE
  13. Spring Cloud(Dalston.SR5)--Eureka 服务实例健康检查
  14. 重温servlet②
  15. 【洛谷】【lca+结论】P3398 仓鼠找sugar
  16. Jsp中格式化时间戳的常用标签
  17. Yii2 upload
  18. myEclipse或eclipse复制或修改项目后的部署名称
  19. 简单谈谈Docker镜像的使用方法_docker
  20. 批量处理任务进度条控制—基于BackgroundWorker

热门文章

  1. JS第三方中间件的延伸
  2. 2012 noip提高 Vigen&#232;re 密码
  3. xenserver tools 安装
  4. Python机器学习2.2
  5. HTML5结构
  6. js的闭包中关于执行环境和作用链的理解
  7. 有关OEP脱壳
  8. POJ 1511 Invitation Cards (最短路的两种方法spfa, Dij)
  9. xtu summer individual 2 D - Colliders
  10. LA 3890 半平面交