一、概述
闭包(Closure)是 JavaScript 中最核心、最具特色也最容易引起困惑的概念之一。它既是前端面试的高频考点,也是理解 JavaScript 执行机制的关键。本文将从原理到实践,带你彻底掌握闭包的本质。
二、闭包的核心定义
闭包是函数和对其周围(词法)环境的引用的组合。
简单来说,当一个函数内部引用了外部函数的变量,即使外部函数已经执行完毕,这个内部函数仍然可以访问这些外部变量,这就是闭包。
'闭包是指有权访问另一个函数作用域中变量的函数。' —— MDN
三、闭包的形成条件
形成闭包需要满足三个必要条件:
- 函数嵌套:内部函数定义在外部函数内部
- 引用外部变量:内部函数引用了外部函数的变量
- 外部调用:内部函数被返回或在外部被调用
function outer() {
let outerVar = '外部变量';
function inner() {
console.log(outerVar); // 引用外部变量
}
return inner; // 返回内部函数
}
const closure = outer(); // 调用外部函数并保存返回的内部函数
closure(); // 输出:外部变量
四、闭包的工作原理
1. 作用域链机制
JavaScript 采用词法作用域(静态作用域),函数的作用域在定义时就已确定,而不是在执行时。
当函数被创建时,它会保存对其外层作用域的引用,形成一条作用域链。
function outer() {
let a = 1;
function inner() {
let b = 2;
console.log(a + b); // 作用域链查找:inner -> outer -> global
}
return inner;
}


