作用域与闭包
约 376 字大约 1 分钟
布欧-Lewyon
2026-05-16
首页 › JavaScript › 函数与作用域 › 作用域与闭包
作用域
// 全局作用域
let globalVar = '全局';
function test() {
// 函数作用域
let funcVar = '函数内';
if (true) {
// 块级作用域
let blockVar = '块内';
var oldVar = 'var 无视块级作用域';
}
console.log(funcVar); // ✅
// console.log(blockVar); // ❌ 块级外不可访问
console.log(oldVar); // ✅ var 提升到函数级
}
// console.log(funcVar); // ❌ 函数外不可访问作用域链
let x = '全局';
function outer() {
let x = '外部';
function inner() {
let x = '内部';
console.log(x); // "内部"(就近查找)
}
inner();
console.log(x); // "外部"
}
outer();闭包
闭包:函数能够"记住"其词法作用域,即使函数在其作用域之外执行。
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
// count 变量被闭包"记住",不会被回收实用场景
// 1. 私有变量
function createUser(name) {
let password = '';
return {
setPassword(pwd) { password = pwd; },
checkPassword(pwd) { return password === pwd; },
};
}
// 2. 柯里化
function multiply(a) {
return function(b) {
return a * b;
};
}
const double = multiply(2);
console.log(double(5)); // 10小结
| 概念 | 要点 |
|---|---|
| 作用域 | 全局 → 函数 → 块级,由内向外查找 |
| 作用域链 | 函数定义时的作用域层级链 |
| 闭包 | 函数 + 其词法环境,用于私有变量/柯里化 |
| 内存 | 闭包会持有外部变量,注意内存泄漏 |
上一节:函数基础与参数 下一节:this 关键字与箭头函数
