3 回答

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個贊
如果您希望變量在其他位置可引用,則可以在外部作用域中聲明該變量,而不必增加計(jì)數(shù):count
let count = 10;
function counter2() {
return count++;
}
counter2();
counter2();
console.log(count);
如果變量位于閉包內(nèi),并且閉包僅公開返回的函數(shù),則上述操作是不可能的 - 唯一的選擇是調(diào)用返回的函數(shù),即使您只想檢查其當(dāng)前值,該函數(shù)也會遞增計(jì)數(shù)。count
第一種方法,其中只能由閉包中的函數(shù)查看,如果你想向代碼的使用者和讀者清楚地表明變量是私有的(并且在外部完全不可訪問),這將是有用的。countcountercounterMakercount
當(dāng)您想要創(chuàng)建計(jì)數(shù)器的多個實(shí)例時(shí),第一種方法也可以工作,而第二種方法則不行(除非您每次需要計(jì)數(shù)器時(shí)都重復(fù)計(jì)數(shù)器變量并運(yùn)行函數(shù),這很愚蠢)。

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個贊
計(jì)數(shù)器 1 代碼的說明。
// counter1 code
function counterMaker() {
let count = 0;
return function counter() {
return count++;
};
}
在這里,您將函數(shù)返回給調(diào)用方。因此,可以在呼叫者處執(zhí)行類似操作。
var c = counterMaker()
c() //0
c() //1
c() //1
var b = counterMaker()
b() //0
b() //1
b() //1
因?yàn)槟趪L試使用函數(shù)表達(dá)式時(shí)嘗試將該函數(shù)和變量環(huán)境括起來。因此,您的增量函數(shù)不會暴露在外部。如果這有意義,那么你就會明白為什么閉包和閉包在哪里的整個簡潔性。
代碼 2 的說明
// counter2 code
let count = 10;
function counter2() {
return count++;
}
您正在嘗試將遞增函數(shù)公開到全局中,現(xiàn)在您將無法創(chuàng)建像上面代碼 1 那樣的多個實(shí)例。因此,每次調(diào)用函數(shù) counter2 時(shí),它只會增加 whatsover。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個贊
我認(rèn)為在這種情況下,通過閉包訪問變量比訪問外部變量更可取。訪問外部變量會產(chǎn)生副作用,您的函數(shù)依賴于在其外部發(fā)生的變化,并且它們可能是不可預(yù)測的?;蛘?,將來,您將要移動此函數(shù),您仍然需要監(jiān)視此外部變量。我認(rèn)為所有外部依賴關(guān)系都應(yīng)該通過參數(shù)傳遞給函數(shù)。
添加回答
舉報(bào)