JavaScript 执行上下文与调用栈解析
前端JavaScript
执行上下文(Execution Context)
JS 运行代码时,会创建一个执行上下文,里面保存当前代码执行需要的环境信息,比如变量、函数、作用域链等。
执行上下文(Execution Context)里面主要包含以下几个核心内容:
- 变量环境(Variable Environment)
保存变量和函数声明的信息,包含当前作用域的变量、函数和参数等。它由环境记录(Environment Record)和外部词法环境(Outer Lexical Environment Reference)组成。
- 作用域链(Scope Chain)
是一个由当前执行上下文的变量环境和父级上下文的变量环境组成的链,用于变量查找。
- this 绑定(this Binding)
当前执行上下文中
this 的具体指向。执行上下文栈(Execution Context Stack)
JS 是单线程的,执行上下文是按照顺序入栈和出栈的。当函数被调用时,会创建一个新的执行上下文,压入执行上下文栈顶(栈顶是当前正在执行的上下文)。函数执行完毕后,对应的执行上下文会从栈顶弹出,控制权回到上一个上下文。
简单流程:
- 进入全局执行上下文,压入栈顶。
- 调用函数 A,创建 A 的执行上下文,压入栈顶。
- 函数 A 内调用函数 B,创建 B 的执行上下文,压入栈顶。
- 函数 B 执行完,弹出 B 的执行上下文。
- 函数 A 执行完,弹出 A 的执行上下文。
- 最后回到全局执行上下文,执行完毕后弹出。