Appearance
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 引擎执行代码时,用来管理当前执行状态和相关环境的一套机制。它主要管理:
- 变量环境:
var声明、函数声明、参数arguments、形参等; - 词法环境:
let、const、class这类具有块级作用域的声明; this的解析;- 外层环境引用[[OuterEnv]]:通过外层环境[[Environment]]查找变量的机制(把变量环境、词法环境逐层关联起来,就形成了作用域链)。
早期 ES3 规范中的说法是:变量对象(VO)、活动对象(AO)、作用域链、
this。