signed

QiShunwang

“诚信为本、客户至上”

setTimeout 是到了xx ms 就执行吗,了解浏览器的 Event-Loop 机制

2020/12/26 20:58:40   来源:

最近看了波 JavaScript 相关的文章,不得不说,JavaScript 我还真没玩明白(给我哭~。。。😅)。也挺久没写文了,实习(“摸🐟”)之余小记一波。

回顾一句话:JavaScript 是一门单线程、非阻塞、异步、解释性脚本语言。

本文的标题是:setTimeout 是到了xx ms 就执行吗,了解 Event-Loop 机制。先回答波:不是。

来看下网上的一段经典 js 代码在浏览器中「Microsoft Edge 84.0.522.63(64位)」的执行结果。

console.log(‘script start’);
setTimeout(() => {
console.log(‘setTimeout’);
},0);
Promise.resolve().then(() => {
console.log(‘promise1’);
}).then(() =>{
console.log(“promise2”);
});
console.log(‘script end’);
执行结果

可以明显看到 setTimeout 的 callback 并非在 0 ms 后立即执行。那么,这是问什么?要了解原因,需要了解后续介绍的 Event Loop 机制。

概念一览
浏览器的内核-多线程的渲染进程:页面的渲染、js 的执行、事件的循环都在渲染进程中进行。渲染进程主要包含以下几个线程:
{% fancybox %}
JS内核中的线程
{% endfancybox %}

Task:Task 有 MicroTask 和 MacroTask 之分,MicroTask 在 Promise 出现之后引入。MacroTask 和 MicroTask 分别在以下几种场景形成:
MacroTask:主代码块、setTimeout、setInterval、IO 事件等。
MicroTask:Promise、process.nextTick 等。
浏览器中的Event Loop
有了基础概念,让我们来了解一下文章开头给出的代码是怎么执行的,代码如下:

console.log(‘script start’);
setTimeout(() => {
console.log(‘setTimeout’);
},0);
Promise.resolve().then(() => {
console.log(‘promise1’);
}).then(() =>{
console.log(“promise2”);
});
console.log(‘script end’);
1、首先,整个代码块作为第一个 MacroTask 被执行,同步的代码直接被压入执行栈被执行「同步任务在JS引擎线程上执行」,script start 和 script end 被打印;
2、setTimeout 被作为 MacroTask 处理,加入宏任务队列中;
3、Promise 被作为 MicroTask 处理,加入微任务队列中;
4、本次 MacroTask 处理完毕,检查微任务队列,发现 promise then 的 callback,promise1,promise2 先后打印;
5、接下来执行下一个 MacroTask,即 setTimeout 推送给任务队列的 callback,打印 setTimeout。
so,代码执行结果如下:

script start
script end
promise1
promise2
setTimeout
由此,可大致了解到浏览器下 Event-Loop 执行机制大致如下:

{% folding open red, Event-Loop 执行机制 %}

1、一开始,整段脚本被当作 MacroTask 执行
2、执行过程中,同步代码进入可执行栈中直接执行,MacroTask 进入宏任务队列,MicroTask 进入微任务队列
3、当前 MacroTask 执行完就出队,检查微任务队列,如果不为空,则依次执行微任务队列中的 MicroTask,直到微任务队列为空
4、执行浏览器的 UI 线程的渲染工作「两个 MicroTask 执行空隙,有次 render 工作」
6、执行队首的 MacroTask,回到 2,依此循环,直至宏任务队列和微任务队列都为空
可通过下图简单理解一波:

浏览器 Event-Loop 简览

{% endfolding %}

由此可知道,setTimeout 中的 callback 不能按时执行是因为 Event-Loop,导致 JS 引擎线程还有其它的 task (promise MicroTask)要处理,主线程还未空闲下来。

参考
What the heck is the event loop anyway?「很精彩的演讲🐂」
从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
精读《Tasks, microtasks, queues and schedules》
😇原生JS灵魂之问(下)
【THE LAST TIME】彻底吃透 JavaScript 执行机制
标签: JavaScript, Python
好文要顶 关注我 收藏该文
yeshan333
关注 - 2
粉丝 - 2
+加关注
1 0
« 上一篇: Latex基本语法简记
posted @ 2020-12-26 19:36 yeshan333 阅读(31) 评论(1) 编辑 收藏

评论列表
#1楼 2020-12-26 19:52 司机六岁半
good~

支持(0) 反对(0)
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
写给园友们的一封求助信
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】博客园x丝芙兰-圣诞特别活动:圣诞选礼,美力送递
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【福利】AWS携手博客园为开发者送免费套餐+50元京东E卡
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动最近看了波 JavaScript 相关的文章,不得不说,JavaScript 我还真没玩明白(给我哭~。。。😅)。也挺久没写文了,实习(“摸🐟”)之余小记一波。

回顾一句话:JavaScript 是一门单线程、非阻塞、异步、解释性脚本语言。

本文的标题是:setTimeout 是到了xx ms 就执行吗,了解 Event-Loop 机制。先回答波:不是。

来看下网上的一段经典 js 代码在浏览器中「Microsoft Edge 84.0.522.63(64位)」的执行结果。

console.log(‘script start’);
setTimeout(() => {
console.log(‘setTimeout’);
},0);
Promise.resolve().then(() => {
console.log(‘promise1’);
}).then(() =>{
console.log(“promise2”);
});
console.log(‘script end’);
执行结果

可以明显看到 setTimeout 的 callback 并非在 0 ms 后立即执行。那么,这是问什么?要了解原因,需要了解后续介绍的 Event Loop 机制。

概念一览
浏览器的内核-多线程的渲染进程:页面的渲染、js 的执行、事件的循环都在渲染进程中进行。渲染进程主要包含以下几个线程:
{% fancybox %}
JS内核中的线程
{% endfancybox %}

Task:Task 有 MicroTask 和 MacroTask 之分,MicroTask 在 Promise 出现之后引入。MacroTask 和 MicroTask 分别在以下几种场景形成:
MacroTask:主代码块、setTimeout、setInterval、IO 事件等。
MicroTask:Promise、process.nextTick 等。
浏览器中的Event Loop
有了基础概念,让我们来了解一下文章开头给出的代码是怎么执行的,代码如下:

console.log(‘script start’);
setTimeout(() => {
console.log(‘setTimeout’);
},0);
Promise.resolve().then(() => {
console.log(‘promise1’);
}).then(() =>{
console.log(“promise2”);
});
console.log(‘script end’);
1、首先,整个代码块作为第一个 MacroTask 被执行,同步的代码直接被压入执行栈被执行「同步任务在JS引擎线程上执行」,script start 和 script end 被打印;
2、setTimeout 被作为 MacroTask 处理,加入宏任务队列中;
3、Promise 被作为 MicroTask 处理,加入微任务队列中;
4、本次 MacroTask 处理完毕,检查微任务队列,发现 promise then 的 callback,promise1,promise2 先后打印;
5、接下来执行下一个 MacroTask,即 setTimeout 推送给任务队列的 callback,打印 setTimeout。
so,代码执行结果如下:

script start
script end
promise1
promise2
setTimeout
由此,可大致了解到浏览器下 Event-Loop 执行机制大致如下:
创造环境
这里再举个例子
这是一个很有名的故事
下面就是一个很好例子
先来看一位母亲的经历
君临渊微微蹙眉嗯?
常三快要被吓死了!
常三啊?
她长得有那么可怕吗?
我自己过去。
第535章一巴掌!
凤舞惊呆了!
她给气坏了!
清脆的巴掌声!
君、临、渊、啊!
舞小姐这回怕是
然而双方实力相差太大
第536章星辰碎片
温泉池?
报名时间截止了?
陆院长不给通融?
星辰碎片!
要干什么!
凤舞!!!
第537章搓澡舞
凤舞快被气坏了!
这姿态变化的可真是
封管家默默扶额。
再脱下去可要光果了!
君殿下瞥了凤舞一眼。
君临渊皱眉。
君殿下嗤笑有我好看?
都是因为这破丫头。
凤舞深吸一口气。
为了星辰碎片
凤舞惊呼一声。
会伺候吗?
她居然还同情他?
君临渊轻哼一声随便。
宫嬷嬷面带忧愁之色。
凤舞这么硬怎么动?
就因为硬才要动啊。
君临渊讲不讲道理的?
这时候谁和讲道理?
两人对视一眼!!!
封管家简直不信了!
心理美文《心若向阳》
散文《最美的遇见》
青春励志美文摘抄
余秋雨《我在等你》
人生哲理美文摘抄
海子《以梦为马》
林徽因散文《人生若只如初见》
徐志摩《认识你真好》
仓央嘉措最美的十首情诗
《陌上花开》原文朗诵
《陌上花开》散文
徐志摩的《邂逅》原文
散文《听雨》
徐志摩的散文《落叶》
《陌上花开》徐志摩
经典美文大全
《意林》摘抄加赏析
适合抄在摘抄本上的句子
席慕容散文《时光》
《遇见自己》海子
正能量的治愈系美文
适合播音的治愈系文章
治愈系小短文
触动心灵的美文
暖心的短句唯美
经典美文欣赏50篇
张爱玲散文《迟暮》
震撼心灵的经典美文
优秀经典美文
朗诵《做最好的自己》
名家名篇经典美文
张爱玲散文《等》
董卿朗读作品《勇气》
自学英语口语成功经验
英语入门自学
如何自己学好英语
免费三年级英语视频人教版
小学三年级英语第1课
三年级上册第一课英语
三年级英语同步视频
英语三年级上册电子书
三年级上册英语直播课
三年级上册英语人教版免费
小学人教版英语三年级上册视频
学英语最好的免费网站
长期免费学英语网站
天天学英语口语免费
自学英语app哪个好免费
{% folding open red, Event-Loop 执行机制 %}

1、一开始,整段脚本被当作 MacroTask 执行
2、执行过程中,同步代码进入可执行栈中直接执行,MacroTask 进入宏任务队列,MicroTask 进入微任务队列
3、当前 MacroTask 执行完就出队,检查微任务队列,如果不为空,则依次执行微任务队列中的 MicroTask,直到微任务队列为空
4、执行浏览器的 UI 线程的渲染工作「两个 MicroTask 执行空隙,有次 render 工作」
6、执行队首的 MacroTask,回到 2,依此循环,直至宏任务队列和微任务队列都为空
可通过下图简单理解一波:

浏览器 Event-Loop 简览

{% endfolding %}

由此可知道,setTimeout 中的 callback 不能按时执行是因为 Event-Loop,导致 JS 引擎线程还有其它的 task (promise MicroTask)要处理,主线程还未空闲下来。

参考
What the heck is the event loop anyway?「很精彩的演讲🐂」
从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
精读《Tasks, microtasks, queues and schedules》
😇原生JS灵魂之问(下)
【THE LAST TIME】彻底吃透 JavaScript 执行机制
标签: JavaScript, Python
好文要顶 关注我 收藏该文
yeshan333
关注 - 2
粉丝 - 2
+加关注
1 0
« 上一篇: Latex基本语法简记
posted @ 2020-12-26 19:36 yeshan333 阅读(31) 评论(1) 编辑 收藏

评论列表
#1楼 2020-12-26 19:52 司机六岁半
good~

支持(0) 反对(0)
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
写给园友们的一封求助信
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】博客园x丝芙兰-圣诞特别活动:圣诞选礼,美力送递
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【福利】AWS携手博客园为开发者送免费套餐+50元京东E卡
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动