主题
什么是运行栈
运行栈,也叫 调用栈(Call Stack) 或 执行上下文栈
运行栈是JS引擎迎来管理函数调用顺序的一块内存结构
遵循先进后出的规则
最后调用的函数,最先执行完并退出
运行栈中存的是什么
每当 JS 执行一段代码(脚本或函数),引擎都会创建一个 执行上下文,里面包含:变量环境、词法环境、this绑定、外部环境引用
这些上下文对象会依次压入 运行栈 中
执行过程举例
一个简单例子
js
function a() {
console.log('a start')
b()
console.log('a end')
}
function b() {
console.log('b')
}
a()
执行过程:
开始执行全局代码
JS 会创建一个 全局执行上下文(Global Execution Context)
把它 压入运行栈
现在运行栈是:
[ Global ]
调用函数 a()
创建 a 的执行上下文
压入运行栈
[ a, Global ]
执行 a 内部的 b()
创建 b 的执行上下文
压入运行栈
[ b, a, Global ]
b 执行完毕
b 的上下文从栈顶弹出
[ a, Global ]
a 执行完毕
弹出 a
[ Global ]
程序执行完毕
全局上下文也出栈
[]
运行栈与异步的关系
JS 是单线程的 所以 运行栈只有一个,不能同时运行两个函数。
当遇到异步操作(如 setTimeout
、Promise
)时,JS 会把它们交给 事件循环,由事件循环调度异步任务,等待当前运行栈清空后,再将回调函数压入栈执行。