JS运行机制

JS:同步和异步
异步:
宏任务 :setTimeout、setInterval、setImmediate会产生宏任务。
微任务:requestAnimationFrame、IO、读取数据、交互事件、UI render、Promise.then、MutationObserve、process.nextTick会产生微任务。

浏览器中的JavaScript脚本执行过程
4.3.1 过程描述

a. JavaScript脚本进入主线程, 开始执行

b. 执行过程中如果遇到宏任务和微任务,分别将其挂起,只
有当任务就绪时将事件放入相应的任务队列

c. 脚本执行完成,执行栈清空

d. 去微任务队列依次读取事件,并将相应的回调函数放入执行栈运行,如果执行过程中遇到宏任务和微任务,处理方式同 b, 直到微任务队列为空

e. 浏览器执行渲染动作, GUI渲染线程接管,直到渲染结束

f. JS线程接管,去宏任务队列依次读取事件,并将相应的回调函数放入执行栈, 开始下一个宏任务的执行,过程为b -> c -> d -> e
-> f, 如此循环

g. 直到执行栈、宏任务队列、微任务队列都为空,脚本执行结束

JS单线程:

一个任务完成之后,才能执行另外一个任务。

JS运行机制简述

JavaScript 中有同步/异步任务的概念,同步任务在主线程上执行,会形成一个 执行栈,主线程之外,事件触发线程管理着一个 任务队列,只要异步任务有了运行结果,就在 任务队列 之中放一个事件回调。一旦 执行栈 中的所有同步任务执行完毕,就会读取 任务队列,将可运行的异步任务(任务队列中的事件回调,只要任务队列中有事件回调,就说明可以执行)添加到执行栈中,开始执行。
同步/异步任务是广义上的,同时,JavaScript 中还有宏任务(macrotask)和微任务(microtask)这种更加细致的概念,我们可以将每次执行栈执行的代码当做是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行), 每一个宏任务会从头到尾执行完毕,不会执行其他。而在异步任务中,有些特殊的任务我们称之为微任务,它在当前宏任务执行后立即执行。

宏任务和微任务

宏任务:ajax,计时器,读取文件

微任务:promise的then

执行顺序:

  1. 同步任务
  2. process
  3. nextTick
  4. 微任务
  5. 宏任务
  6. setImmediate
setTimeout(function(){
    console.log('1')
});
 
new Promise(function(resolve){
    console.log('2');
    for(var i = 0; i < 10000; i++){
        i == 99 && resolve();
    }
}).then(function(){
    console.log('3')
});
 
console.log('4');
在这里插入代码片

输出:2 4 3 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值