function foo() {
bar();
}
foo();
在查看错误中,我们明显的看到了之前提到的调用栈。
刚才的程序并无异步函数,
如果我们在程序中用到了异步函数
console.log(“begin”);
setTimeout(function cb(){
console.log(“finish”)
}, 1000);
这个时候我们再看执行栈
进栈出栈过程类似上面的分析,可是在这里,直到 main
函数执行完了,我们都没看到 cb
函数执行,可是确确实实 1000ms
左右后 cb
函数真的执行了,这里面是发生了什么情况?
在解释这个之前,我们先引入两个概念
宏观任务和微观任务
1. 宏观任务
在 ES5
之前,异步操作由宿主发起,JavaScript
引擎并不能发起异步操作,这类的异步任务称为宏观任务,比较典型的有
setTimeout(() => {
console.log(“exec”)
}, 2000);
2.微观任务
在 ES5
之后出现了 Promise
,用于解决回调地狱的问题,这个函数也是异步的,会等到 fulfill(resolve 或 reject)
后才会执行 then
方法
new Promise((resolve, reject) => {
resolve(“hello world”)
}).then(data => {
console.log(data)
})
这个异步任务,由 v8
引擎发起 称为微观任务
这两类任务对 event loop
也有影响
接下来进入本文章重点!!
event loop
event loop
分为浏览器环境和 node
环境,实现是不一样的,本篇文章暂时只讨论浏览器环境下的 event loop
1. 浏览器环境下的 event loop
接下来,我们具体看一个很大的例子
console.log(“1”);
setTimeout(function cb1(){
console.log(“2”)
}, 0);
new Promise(function(resolve, reject) {
console.log(“3”)
resolve();
}).then(function cb2(){
console.log(“4”);
})
console.log(“5”)
这段代码用 event loop
的解释是这样的
用文字解释如下,上述动画以及文字解释忽略 main
函数
-
console.log("1")
入栈出栈,控制台显示1
-
setTimeout
入栈,加入异步任务队列(此时处于等待执行完成的状态,对于setTimeout来说就是等待延迟时间算执行完成,对于Promise
来说就是被fulfill
了才算执行完成。 -
new Promise
入栈出栈,控制台显示3
,并且把函数放入异步队列,等待完成了,就执行then
方法,这里的话,演示动画忘记加上了。 -
console.log(5)
入栈出栈,控制台显示5
至此,主函数内的任务全部执行完毕,
这里需要先知道,当任务放入异步任务队列后他们如果完成了,就会自动进入微观任务或者宏观任务队列。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
最后
全网独播-价值千万金融项目前端架构实战
从两道网易面试题-分析JavaScript底层机制
RESTful架构在Nodejs下的最佳实践
一线互联网企业如何初始化项目-做一个自己的vue-cli
思维无价,看我用Nodejs实现MVC
代码优雅的秘诀-用观察者模式深度解耦模块
前端高级实战,如何封装属于自己的JS库
VUE组件库级组件封装-高复用弹窗组件
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img.cn/aHR0cHM6Ly9waWMyLnpoaW1nLmNvbS84MC92Mi00NWJjMGI2OWU4YzY2YTcxYzBkNWFiNjczZTkzM2MyZF9oZC5qcGc?x-oss-process=image/format,png)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-8GnPiW0N-1712465394769)]