你不知道的 JavaScript

执行上下文 & 作用域链

概念

  • 作用域是一套规则,程序根据这套规则来存储变量,并且能在之后对这个变量的值进行访问或修改。
  • 执行上下文是 JS 代码运行时的环境,包含变量环境、作用域链和 this,在创建阶段完成变量提升,在执行阶段逐行运行代码,并通过调用栈进行管理。

原理解析

  • JS 是词法作用域(静态作用域) 词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的。
  • 作用域在定义时确定,而不是执行时
  • 执行上下文包含:
    • 变量环境(var)
    • 词法环境(let / const)
    • this 绑定

示例代码

var a = 1;

function foo() {
  var b = 2;

  function bar() {
    console.log(a, b);
  }

  return bar;
}

var fn = foo();
fn();
                 🌍 全局执行上下文(Global EC)
┌──────────────────────────────────────────────┐
│ 变量环境:                                    │
│   a = 1                                      │
│   foo = function                             │
│                                              │
│ 作用域链: null                               │
│ this → window                                │
└──────────────────────────────────────────────┘
                     ↓ 调用 foo()

        📦 foo 执行上下文(Function EC)
┌──────────────────────────────────────────────┐
│ 变量环境:                                    │
│   b = 2                                      │
│   bar = function                             │
│                                              │
│ 作用域链: → 指向 Global EC                   │
│ this → window                                │
└──────────────────────────────────────────────┘
                     ↓ 调用 bar()

        📦 bar 执行上下文(Function EC)
┌──────────────────────────────────────────────┐
│ 变量环境:                                    │
│   (无局部变量)                              │
│                                              │
│ 作用域链: → foo EC → Global EC               │
│ this → window                                │
└──────────────────────────────────────────────┘