在数据结构中,栈是一种先进后出的结构,如下图(直接在百度中找了一张图):
具有先进后出的特点
在js中,在全局代码执行前,JS引擎将会创建一个栈来存储管理执行的所有上下文对象。在全局执行上下文window确定后,并将其压入栈中,所以window确定的执行上下文是在最底下的,也就是栈底。之后每当有函数被调用,都会创建一个新的函数执行上下文并压入栈内。在当前函数执行完后,移除(也就是出栈)
看下面的例子:
输出:
为什么会是这样的,看下图:
这样一个一个按照栈的规则出去。所以看似执行了fun1 ,但fun1 调用的fun2,fun2又调用的fun3。这样就导致了fun3在栈顶。那么fun1想要运行,就必须运行完fun2和fun3。
再来看一种情况我们将上面函数体中的语句进行交换:
输出结果:
fun2和fun3的调用在fun1函数体执行完之后。那么为什么会变成这样,因为此时栈成了如下的:
然后再运行f2
然后最后运行fun3