JavaScript閉包(Closure)是一種在函數(shù)內(nèi)部創(chuàng)建并返回另一個(gè)函數(shù)的技術(shù)。閉包允許一個(gè)函數(shù)訪問其外部作用域中的變量,即使外部函數(shù)已經(jīng)返回。閉包的原理主要基于JavaScript的作用域鏈(Scope Chain)和詞法環(huán)境(Lexical Environment)。
以下是閉包原理的簡(jiǎn)要說明:
當(dāng)一個(gè)函數(shù)被創(chuàng)建時(shí),它會(huì)攜帶一個(gè)指向其外部作用域的詞法環(huán)境。詞法環(huán)境包含了函數(shù)定義時(shí)所在的作用域中的變量和函數(shù)。
當(dāng)一個(gè)內(nèi)部函數(shù)引用了外部函數(shù)的變量時(shí),JavaScript引擎會(huì)通過詞法環(huán)境鏈找到這個(gè)變量。
即使外部函數(shù)已經(jīng)返回,閉包仍然可以訪問這些變量,因?yàn)閮?nèi)部函數(shù)保留了對(duì)詞法環(huán)境的引用。
下面是一個(gè)簡(jiǎn)單的閉包示例:
function outer() {
let count = 0;
function inner() {
count++;
console.log(count);
}
return inner;
}
const incrementCounter = outer();
incrementCounter(); // 輸出 1
incrementCounter(); // 輸出 2
在這個(gè)例子中,outer
函數(shù)返回了 inner
函數(shù),形成一個(gè)閉包。當(dāng)我們調(diào)用 incrementCounter
時(shí),它實(shí)際上是在調(diào)用 inner
函數(shù)。盡管 outer
函數(shù)已經(jīng)返回,但由于閉包保留了對(duì)外部作用域(包含變量 count
)的引用,所以 inner
函數(shù)仍然可以訪問和修改 count
變量。