作用域与作用域链
约 656 字大约 2 分钟
2025-02-04
问题
什么事作用域?
什么是作用域链?
作用域(Scope)
作用域是变量、函数或对象的可访问范围,决定了代码中哪些部分可以访问这些标识符。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未定义
作用域链(Scope Chain)
作用域链是 JavaScript 查找变量的机制。当访问一个变量时,会按照以下顺序逐层向上查找:
- 当前作用域 → 2. 外层函数作用域 → 3. 全局作用域
作用域链示例
let globalVar = "全局"; // 全局作用域
function outer() {
let outerVar = "外层"; // outer函数作用域
function inner() {
let innerVar = "内层"; // inner函数作用域
console.log(innerVar); // 内层(当前作用域)
console.log(outerVar); // 外层(外层函数作用域)
console.log(globalVar); // 全局(全局作用域)
}
inner();
}
outer();
关键区别与特性
特性 | 作用域(Scope) | 作用域链(Scope Chain) |
---|---|---|
本质 | 变量的可访问范围 | 变量查找的层级链路 |
核心作用 | 隔离变量,避免命名冲突 | 确定变量从哪里被访问 |
典型应用 | 全局变量 vs 局部变量 | 闭包、嵌套函数访问外层变量 |
ES6 影响 | 新增块级作用域(let /const ) | 作用域链结构更清晰,避免变量提升问题 |
实际应用场景
闭包:通过作用域链保留对外部变量的引用
function createCounter() { let count = 0; // 被闭包保留的作用域变量 return function() { return ++count; }; } const counter = createCounter(); console.log(counter()); // 1
避免污染全局作用域
(function() { var privateVar = "私有变量"; // 限制在IIFE作用域内 })();
总结
- 作用域是规则,决定“变量在哪里可用”
- 作用域链是路径,决定“变量从哪里找到”
- 合理利用作用域能提升代码健壮性,而理解作用域链是掌握闭包等高级特性的基础。