3 回答

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

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

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