学web前端:JS 引擎的执行机制

关于JS引擎的执行机制,首先牢记2点:
 
1..JS是单线程语言
 2.JS的Event Loop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的event loop
 
关于单线程相对还比较好理解,就是同时只能做一件事,JS最初设计用在浏览器中的,如果浏览器中的JS是多线程的,那将有可能出现以下场景:
 

那么现在有2个进程,process1 process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作。
 process1 删除了该dom,而process2 编辑了该dom,同时下达2个矛盾的命令,浏览器究竟该如何执行呢?
 
这样想来,JS为什么是单线程的应该就容易理解了。
 
那既然JS是单线程了,为了不造成阻塞,对一些比较大的资源,就会采用异步加载的方式,那JS是如何实现异步的呢? 那就是通过事件循环(event loop),理解了event loop机制,就理解了JS的运行机制的难点!
 
首先看一个栗子,感受一下基本的执行规律:
 console.log(1)
setTimeout(function(){
    console.log(2)
},0)
console.log(3); 
这个栗子的打印结果为1 3 2 


这个地方相对比较好理解,setTimeout里的函数并没有立即执行,而是延迟了一段时间,满足一定条件后才去执行的,这类代码,我们叫异步代码。与它相对的console.log()这些就属于同步任务,按照这种大体的分类方式JS的执行机制是:
 •首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table
 •异步任务在event table中注册函数,当满足触发条件后,被推入event queue
 •同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中
 
以上三步循环执行,这就是event loop。


 
所以,上面关于eventloop就是我对JS执行机制的理解,正常情况下,JavaScript的任务是同步执行的,即执行完前一个任务,然后执行后一个任务。只有遇到异步任务的情况下,执行顺序才会改变。
 
这时,需要区分两种任务:正常任务(task)与微任务(microtask)。它们的区别在于,“正常任务”在下一轮Event Loop执行,“微任务”在本轮Event Loop的所有任务结束后执行。
 console.log(1);
setTimeout(function() {
  console.log(2);
}, 0);
Promise.resolve().then(function() {
  console.log(3);
}).then(function() {
  console.log(4);
});
console.log(5);
// 打印顺序为:1 5 3 4 2 
上面代码的执行结果表明:setTimeout(fn, 0)在Promise.resolve之后执行。


 
这是因为setTimeout语句指定的是“正常任务”,即不会在当前的Event Loop执行。而Promise会将它的回调函数,在状态改变后的那一轮Event Loop指定为微任务。所以,3和4输出在5之后、2之前。
 
正常任务包括以下情况。
 - setTimeout
- setInterval
- setImmediate
- I/O
- 各种事件(比如鼠标单击事件)的回调函数 
微任务目前主要是process.nextTick和 Promise 这两种情况。
 
所以,判断JS的任务执行机制的难点就是有多个异步任务,并且是不同类型的异步任务的时候,这个时候先要分清任务是“正常任务”还是“微任务”,“正常任务”要到下一轮Event Loop执行,所以要晚些执行。快速系统学习web前端知识,快速就业到知海匠库http://www.zhihaijiangku.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值