JavaScript闭包(Closure)是一种在函数内部创建并返回另一个函数的技术。闭包允许一个函数访问其外部作用域中的变量,即使外部函数已经返回。闭包的原理主要基于JavaScript的作用域链(Scope Chain)和词法环境(Lexical Environment)。
以下是闭包原理的简要说明:
-
当一个函数被创建时,它会携带一个指向其外部作用域的词法环境。词法环境包含了函数定义时所在的作用域中的变量和函数。
-
当一个内部函数引用了外部函数的变量时,JavaScript引擎会通过词法环境链找到这个变量。
-
即使外部函数已经返回,闭包仍然可以访问这些变量,因为内部函数保留了对词法环境的引用。
下面是一个简单的闭包示例:
function outer() {
let count = 0;
function inner() {
count++;
console.log(count);
}
return inner;
}
const incrementCounter = outer();
incrementCounter(); // 输出 1
incrementCounter(); // 输出 2
在这个例子中,outer
函数返回了 inner
函数,形成一个闭包。当我们调用 incrementCounter
时,它实际上是在调用 inner
函数。尽管 outer
函数已经返回,但由于闭包保留了对外部作用域(包含变量 count
)的引用,所以 inner
函数仍然可以访问和修改 count
变量。