没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
JS 为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢?
如果 JS 中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会
被阻塞。
对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验
通过的事件循环
(event loop),
理解了
event loop
机制
,
就理解了
JS
的执行机制
console.log(1);
setTimeout(function(){
console.log(2);
},0);
console.log(3);
运行结果是
console.log(1) 是同步任务,放入主线程里
setTimeout() 是异步任务,被放入 event table, 0 秒之后被推入 event queue 里
console.log(3 是同步任务,放到主线程里
当 1、 3 在控制条被打印后,主线程去 event queue(事件队列)里查看是否有可执行的
函数,执行 setTimeout 里的函数
setTimeout(function(){
console.log('定时器开始啦');
});
newPromise(function(resolve){
console.log('马上执行 for 循环啦');
for(vari=0;i<10000;i++){
i==99&&resolve();
}
}).then(function(){
console.log('执行 then 函数啦');
});
console.log('代码执行结束');
运行结果是
马上执行 循环啦 代码执行结束 执行 函数啦 定时器开始啦
准确的划分方式是
宏任务:包括整体代码
,,
微任务:,
的执行机制是
执行一个宏任务!过程中如果遇到微任务!就将其放到微任务的【事件队
列】里
当前宏任务执行完成后!会查看微任务的【事件队列】!并将里面全部的
微任务依次执行完
首先执行 script 下的宏任务,遇到 setTimeout,将其放到宏任务的【队列】里
遇到 new Promise 直接执行,打印"马上执行 for 循环啦"
遇到 then 方法,是微任务,将其放到微任务的【队列里】
打印 "代码执行结束"
本轮宏任务执行完毕,查看本轮的微任务,发现有一个 then 方法里的函数, 打印"执行
then 函数啦"
到此,本轮的 event loop 全部完成。
下一轮的循环里,先执行一个宏任务,发现宏任务的【队列】里有一个 setTimeout 里的
函数,执行打印"定时器开始啦"
剩余18页未读,继续阅读
资源评论
zhengzhengwang
- 粉丝: 7
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功