javascript的执行机制(1)

本文详细解析了JavaScript的执行机制,包括同步和异步任务的区别,宏任务如script和定时器,以及微任务如Promise的工作原理。通过实例展示了事件循环如何决定代码执行顺序,强调了宏任务与微任务在实际应用中的重要性。
摘要由CSDN通过智能技术生成

}).then(function(){

console.log(‘执行then函数啦’)

});

console.log(‘代码执行结束’);

2、执行机制相关知识点

2.1 javascript时一门单线程语言,,前一个任务结束,才会执行后一个任务,如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分两种,一种时同步任务,一种是异步任务。同步任务指的是再主线程排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。异步任务指的是不进入主线程,而是进入”任务队列“的任务,只有”任务对象“通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行

在这里插入图片描述

1、同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。

2、当Event Table中指定的事情完成时,会将这个函数移入Event Queue。

3、主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。

4、上述过程会不断重复,也就是常说的Event Loop(事件循环)。

5、我们不禁要问了,那怎么知道主线程执行栈为空啊?js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。

2.3、JavaScript的宏任务与微任务

你是否觉得同步异步的执行机制流程就是JavaScript执行机制的全部?不是的,JavaScript除了广义上的的同步任务何异步任务,其对任务还有更精细的定义:

宏任务:包括整体代码script、setTimeout、setInterval

微任务:Promise、process.nextTick

不同类型的任务会进入对应的Event Queue

事件循环的顺序:

事件循环(event loop)

决定js代码的执行顺序。进入整他代码(宏任务),开始第一次循环,接着执行所有的微任务。然后再从宏任务开始,找到其中一个热内队列执行完毕,再执行所有的微任务。

在这里插入图片描述

3、以实例来说明JavaScript的执行机制

3.1、同步

console.log(1);

console.log(2);

console.log(3);

/*

执行结果:1、2、3

同步任务,按照顺序一步一步执行

*/

``

3.2、同步和异步

console.log(1);

setTimeout(function() {

console.log(2);

},1000)

console.log(3);

/*

执行结果:1、3、2

同步任务,按照顺序一步一步执行

异步任务,放入消息队列中,等待同步任务执行结束,读取消息队列执行

*/

3.3 、异步任务进一步分析

console.log(1);

setTimeout(function() {

console.log(2);

},1000)

setTimeout(function() {

console.log(3);

},0)

console.log(4);

/*

猜测是:1、4、2、3 但实际上是:1、4、3、2

分析:

同步任务,按照顺序一步一步执行

异步任务,当读取到异步任务的时候,将异步任务放置到Event table(事件表格)

中,当满足某种条件或者说指定事情完成了(这里的是时间分别是达到了0ms和1000ms)当指定

事件完成了才从Event table中注册到Event Queue(事件队列),当同步事件完成了,便从

Event Queue中读取事件执行。(因为3的事情先完成了,所以先从Event table中注册到

Event Queue中,所以先执行的是3而不是在前面的2)

*/

3.4、宏任务和微任务

console.log(1);

setTimeout(function() {

console.log(2)

},1000);

new Promise(function(resolve) {

console.log(3);

resolve();

}

).then(function() {

console.log(4)

});

console.log(5);

/*

以同步异步的方式来判断的结果应该是:1、3、5、2、4

但是事实上结果是:1、3、5、4、2

为什么是这样呢?因为以同步异步的方式来解释执行机制是不准确的,更加准确的方式是宏任务和微任务:

因此执行机制便为:执行宏任务 ===> 执行微任务 ===> 执行另一个宏任务 ===> 不断循环

即:在一个事件循环中,执行第一个宏任务,宏任务执行结束,执行当前事件循环中的微任务,

执行完毕之后进入下一个事件循环中,或者说执行下一个宏任务

*/

3.5、是否彻底理解JavaScript执行机制实例

console.log(‘1’);

setTimeout(function() {

console.log(‘2’);

process.nextTick(function() {

console.log(‘3’);

})

new Promise(function(resolve) {

console.log(‘4’);

resolve();

}).then(function() {

console.log(‘5’)

})

})

process.nextTick(function() {

console.log(‘6’);

})

new Promise(function(resolve) {

console.log(‘7’);

resolve();

}).then(function() {

console.log(‘8’)

})

setTimeout(function() {

console.log(‘9’);

process.nextTick(function() {

console.log(‘10’);

})

new Promise(function(resolve) {

console.log(‘11’);

resolve();

}).then(function() {

console.log(‘12’)

})

})

/*

1、 第一轮事件循环流程分析如下:

整体script作为第一个宏任务进入主线程,遇到console.log,输出1。

遇到setTimeout,其回调函数被分发到宏任务Event Queue中。我们暂且记为setTimeout1。

遇到process.nextTick(),其回调函数被分发到微任务Event Queue中。我们记为process1。

遇到Promise,new Promise直接执行,输出7。then被分发到微任务Event Queue中。我们记为then1。

又遇到了setTimeout,其回调函数被分发到宏任务Event Queue中,我们记为setTimeout2。

宏任务Event Queue 微任务Event Queue

setTimeout1 process1

setTimeout2 then1

上表是第一轮事件循环宏任务结束时各Event Queue的情况,此时已经输出了1和7。

我们发现了process1和then1两个微任务。

执行process1,输出6。

执行then1,输出8。

好了,第一轮事件循环正式结束,这一轮的结果是输出1,7,6,8。

2、 那么第二轮时间循环从setTimeout1宏任务开始:

首先输出2。接下来遇到了process.nextTick(),同样将其分发到微任务Event Queue中,

记为process2。new Promise立即执行输出4,then也分发到微任务Event Queue中,记为then2。

宏任务Event Queue 微任务Event Queue

setTimeout2 process2

then2

第二轮事件循环宏任务结束,我们发现有process2和then2两个微任务可以执行。

输出3。

输出5。

第二轮事件循环结束,第二轮输出2,4,3,5。

3、 第三轮事件循环开始,此时只剩setTimeout2了,执行。

直接输出9。

将process.nextTick()分发到微任务Event Queue中。记为process3。

直接执行new Promise,输出11。

将then分发到微任务Event Queue中,记为then3。

宏任务Event Queue 微任务Event Queue

process3

then3

第三轮事件循环宏任务执行结束,执行两个微任务process3和then3。

输出10。

输出12。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽

-1713505777670)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

[外链图片转存中…(img-0aC6nl3J-1713505777670)]

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽

资料领取方式:戳这里免费领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值