JavaScript閉包(Closure)是一種在函數(shù)內(nèi)部創(chuàng)建并返回另一個(gè)函數(shù)的技術(shù)。閉包可以讓你訪問(wèn)并操作外部作用域的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢。閉包在JavaScript中具有很多用途,如數(shù)據(jù)隱藏、模擬私有變量和實(shí)現(xiàn)函數(shù)柯里化等。
以下是使用閉包的一個(gè)簡(jiǎn)單示例:
function outer() {
let count = 0; // 這是一個(gè)外部作用域的變量
function inner() {
count++; // 在內(nèi)部函數(shù)中訪問(wèn)并修改外部作用域的變量
console.log(count);
}
return inner; // 返回內(nèi)部函數(shù),使其在外部作用域之外仍然可訪問(wèn)
}
const incrementCounter = outer(); // 調(diào)用外部函數(shù)并獲取內(nèi)部函數(shù)
incrementCounter(); // 輸出 1
incrementCounter(); // 輸出 2
在這個(gè)示例中,outer
函數(shù)返回了 inner
函數(shù)。當(dāng)我們調(diào)用 outer
函數(shù)時(shí),它返回 inner
函數(shù)的引用,而不是立即執(zhí)行它。然后我們可以將這個(gè)引用賦值給 incrementCounter
變量,并在之后的代碼中調(diào)用它。由于閉包的作用,inner
函數(shù)可以訪問(wèn)并修改 count
變量,即使 outer
函數(shù)已經(jīng)執(zhí)行完畢。
這是一個(gè)更復(fù)雜的使用閉包的示例,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器:
function createCounter() {
let count = 0;
return {
increment: function () {
count++;
console.log(count);
},
decrement: function () {
count--;
console.log(count);
},
getCount: function () {
return count;
},
};
}
const counter = createCounter();
counter.increment(); // 輸出 1
counter.increment(); // 輸出 2
counter.decrement(); // 輸出 1
console.log(counter.getCount()); // 輸出 1
在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為 createCounter
的函數(shù),它返回一個(gè)包含三個(gè)方法的對(duì)象:increment
、decrement
和 getCount
。這些方法都可以訪問(wèn)和修改 count
變量,但由于閉包的作用,它們?cè)谕獠孔饔糜蛑馊匀豢梢栽L問(wèn)它。這樣我們就可以通過(guò)調(diào)用 createCounter
函數(shù)來(lái)創(chuàng)建一個(gè)帶有私有變量的計(jì)數(shù)器對(duì)象。