作用域
约 565 字大约 2 分钟
2026-03-31
思考
什么是作用域?
作用域链是什么?
作用域
作用域是变量、函数或对象的可访问范围,决定了代码中哪些部分可以访问这些标识符。JavaScript 中有以下作用域类型:
1. 全局作用域
- 定义在函数或代码块外的变量
- 可在代码任何位置访问
let globalVar = "全局变量"; // 全局作用域 function show() { console.log(globalVar); // 可以访问 }
2. 函数作用域
- 通过
var在函数内定义的变量 - 只能在函数内部访问
function func() { var localVar = "局部变量"; // 函数作用域 console.log(localVar); // 可以访问 } console.log(localVar); // 报错:localVar未定义
3. 块级作用域(ES6+)
- 通过
let/const在代码块({})内定义的变量 - 只能在代码块内访问
if (true) { let blockVar = "块级变量"; // 块级作用域 console.log(blockVar); // 可以访问 } console.log(blockVar); // 报错:blockVar未定义
作用域链
作用域链是 JavaScript 执行上下文中的核心机制,它定义了标识符解析的静态规则。作用域链在函数创建时基于词法环境确立,体现了 JavaScript 的词法作用域特性。
从实现角度看,作用域链是一个由变量对象组成的链表结构,规定了引擎在访问变量时的查找路径。当在某个执行上下文中访问标识符时,引擎会遵循以下解析顺序:
- 首先在当前执行上下文的变量对象(活动对象)中查找
- 若未找到,则沿作用域链向上在外层执行环境的变量对象中查找
- 递归执行此过程,直至抵达全局执行上下文的变量对象
- 若全局上下文中仍未找到该标识符的定义,则抛出 ReferenceError
这一机制确保了变量访问的确定性和可预测性,同时也是闭包实现的理论基础——函数通过维护其定义时的作用域链,得以在创建它的执行环境销毁后仍能访问其中的变量。
拓展阅读:JavaScript 中的作用域链