亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哪種Javascript閉包方案是首選?

哪種Javascript閉包方案是首選?

30秒到達戰場 2022-08-18 15:50:12
在什么情況下計數器 1 更可?。吭谑裁辞闆r下計數器 2 會更好?我知道當全局聲明變量時可能是不可預測的,但是是否有一種情況會比在函數中聲明它更可???// counter1 codefunction counterMaker() {  let count = 0;  return function counter() {    return count++;  };}// counter2 codelet count = 10;function counter2() {  return count++;}
查看完整描述

3 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

如果您希望變量在其他位置可引用,則可以在外部作用域中聲明該變量,而不必增加計數:count


let count = 10;


function counter2() {

  return count++;

}



counter2();

counter2();

console.log(count);

如果變量位于閉包內,并且閉包僅公開返回的函數,則上述操作是不可能的 - 唯一的選擇是調用返回的函數,即使您只想檢查其當前值,該函數也會遞增計數。count


第一種方法,其中只能由閉包中的函數查看,如果你想向代碼的使用者和讀者清楚地表明變量是私有的(并且在外部完全不可訪問),這將是有用的。countcountercounterMakercount


當您想要創建計數器的多個實例時,第一種方法也可以工作,而第二種方法則不行(除非您每次需要計數器時都重復計數器變量并運行函數,這很愚蠢)。


查看完整回答
反對 回復 2022-08-18
?
白板的微信

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。


查看完整回答
反對 回復 2022-08-18
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

我認為在這種情況下,通過閉包訪問變量比訪問外部變量更可取。訪問外部變量會產生副作用,您的函數依賴于在其外部發生的變化,并且它們可能是不可預測的?;蛘?,將來,您將要移動此函數,您仍然需要監視此外部變量。我認為所有外部依賴關系都應該通過參數傳遞給函數。


查看完整回答
反對 回復 2022-08-18
  • 3 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號