这个你可能得去问 javascript
的作者了。
执行栈
由于 javascript
是单线程语言,因此只有一个执行栈(调用栈)
function baz() {
console.log(“exec”)
}
function bar() {
baz();
}
function foo() {
bar();
}
foo();
我们可以用一个动画来演示执行栈的调用过程
根据动画流程,我们详细说一下调用栈的情况
-
main
函数,也就是把整个javascript
看成一个函数,入栈 -
foo
函数被执行,入栈 -
bar
函数被执行,入栈 -
baz
函数被执行,入栈 -
console.log
函数被执行,入栈 -
console.log
函数执行完毕,出栈 -
baz
函数执行完毕,出栈 -
bar
函数执行完毕,出栈 -
foo
函数执行完毕,出栈 -
main
函数执行完毕,出栈
这种调用栈可以在程序报错的时候起到很好的 debug
的作用
function baz() {
throw new Error(“noop!”);
}
function bar() {
baz();
}
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
至此,主函数内的任务全部执行完毕,
这里需要先知道,当任务放入异步任务队列后他们如果完成了,就会自动进入微观任务或者宏观任务队列。
这个时候 event loop
检索微观任务队列是否有任务,如果有,就拖到 执行栈中执行,如果没有的话,就检索宏观任务队列是否有任务。
而且,如果一旦微观任务队列有任务,就一定会先执行微观任务队列的。
如果一旦执行栈有任务就一定会先执行执行栈的。
可以用代码表述如下
while (true) {
while (如果执行栈有任务) {
// 执行
}
if (微观任务队列有任务) {
// 执行
continue;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处免费获取。
图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
[外链图片转存中…(img-f1B0gaWl-1712258537839)]
[外链图片转存中…(img-MZkfTvwN-1712258537839)]
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处免费获取。