最近在刷面试题,当看到函数执行栈的时候有点百思不得其解,我当时理解的执行栈不就是函数的执行顺序吗,函数执行顺序按照调用顺序从上到下运行,异步的站到一边留个标记,其他同步的接着运行,和执行栈的“先进后出”原则也不是一回事啊
后来经过多方了解,结合自己的理解尝试写下自己的理解,如果有不对的大家多多批评指正,插一句嘴,下文不考虑异步函数的情况
现在我理解的执行栈是调用一个函数就是一个栈,在多个函数嵌套使用下遵循执行栈的“先进后出”原则,比如说有三个函数:foo、bar和baz,如果这三个函数分别调用,三个函数之间不存在嵌套关系,那么这三个函数就分别是三个不同的执行栈,分别遵循各自的“先进后出”原则,也就是我上面所说的按照调用顺序从上到下依次执行。而如果这三个函数存在嵌套关系,形成了一个函数调用链,那么此时最外层的那个函数先入栈执行内部代码,当执行到调用第二个函数的位置时,第二个函数入栈执行内部代码,当执行到第三个函数的位置时,第三个函数入栈,执行第三个函数的代码,此时第三个函数属于最后一个函数,没有其他的函数需要入栈,此时第三个函数率先出栈,接着第二个函数出栈,最后第一个函数出栈直到函数运行完毕,执行栈为空。
如果上面关于函数调用链看不懂的话可以结合下面的代码辅助理解,复制下来看看输出结果
function foo() {
console.log("Entering foo");
bar();
console.log("Exiting foo");
}
function bar() {
console.log("Entering bar");
baz();
console.log("Exiting bar");
}
function baz() {
console.log("Entering baz");
console.log("Exiting baz");
}
foo();