Skip to content

0. 作用域、作用域链、执行上下文 ​

难度等级:🟢 初级 分类:JavaScript 归档日期:2026-10-19


一、作用域(Scope) ​

作用域就是 JavaScript 访问变量的规则。

我们知道 JavaScript 是有函数作用域的,也就是说,函数内部定义的变量(通常来说)在函数外部是无法访问的。

如果按照类型来分,除了函数作用域,JavaScript 还有全局作用域;ES6 之后又有了块级作用域,也就是用 let、const 在花括号内声明的变量。

JavaScript 作用域的另一个特征是采用词法作用域:变量的访问规则在代码书写完成时就确定了,而不是由函数在哪里调用决定的。

javascript
var value = 1;

function foo() {
  console.log(value);
}

function bar() {
  var value = 2;
  foo();
}

bar(); // 1,而不是 2

二、作用域链 ​

JS 代码访问一个变量时,会先在当前作用域查找,找不到就去外层环境找,直到全局环境。这条查找变量的链路就是作用域链。

作用域链是代码编写完成后就确定的吗?

函数访问变量的规则在函数创建时就确定了,但具体的环境和变量绑定,要在代码运行时才会创建。

比如闭包函数多次创建时,它们的作用域链是不同的。下面的例子中嵌套关系都相同,但作用域链不同:

javascript
function outer(value) {
  return function inner() {
    console.log(value);
  };
}

const fn1 = outer(1);
const fn2 = outer(2);

fn1(); // 1
fn2(); // 2

三、执行上下文 / 执行环境(Execution Context) ​

执行上下文是 JS 引擎执行代码时,用来管理当前执行状态和相关环境的一套机制。它主要管理:

  1. 变量环境:var 声明、函数声明、参数 arguments、形参等;
  2. 词法环境:let、const、class 这类具有块级作用域的声明;
  3. this 的解析;
  4. 外层环境引用[[OuterEnv]]:通过外层环境[[Environment]]查找变量的机制(把变量环境、词法环境逐层关联起来,就形成了作用域链)。

早期 ES3 规范中的说法是:变量对象(VO)、活动对象(AO)、作用域链、this。

个人面试题归档,持续更新中