簡體   English   中英

為什么嵌套的 IIFE 沒有創建閉包?

[英]Why a nested IIFE is not creating closure?

我正在閱讀此資源,試圖了解閉包在 Javascript 中的工作原理。

我知道每次在正常詞法范圍之外調用函數時,它都會創建閉包,從而能夠訪問封閉的函數變量並使用它們來存儲狀態。

這適用於my_module.incrCounter(); 下面(它不斷增加計數器),但為什么它在my_module.incrLocalCounter();不起作用my_module.incrLocalCounter(); ,哪個每次都返回 1?

如果不是里面的IIFE incrLocalCounter創建關閉了local_counter

var my_module = (function tlModule(){

  var counter = 0;

  function incrCounter(){

    counter++
    console.log(counter);

  };



  function incrLocalCounter(){

    var local_counter = 0;

    (function () {
      local_counter++
      console.log(local_counter)
    })();

  };

  return {

    incrCounter: incrCounter,
    incrLocalCounter: incrLocalCounter

  }

})();

您的“嵌套”IIFE 每次都記錄 1,因為在 IIFE 運行之前,遞增的變量始終初始化為 0。 也就是說,在嵌套函數中, local_counter總是從 0 開始。

如果您將local_countervar聲明local_counter incrLocalCounter()之外,那么您將看到它增加。 或者,您可以讓incrLocalCounter()返回一個函數,並將其作為您返回的屬性值:

function incrLocalCounter(){

  var local_counter = 0;

  return function () {
    local_counter++
    console.log(local_counter)
  };

};

return {

  incrCounter: incrCounter,
  incrLocalCounter: incrLocalCounter() // <-- call the function

}

如果不是里面的IIFE incrLocalCounter創建關閉了local_counter

確實如此。 local_counter0 然后它通過執行 IIFE 將它從0增加到1 然后它返回1 每次調用incrLocalCounter時,它都會執行相同的序列(包括將local_counter設置為0 )。 區別不在於incrLocalCounter有一個 IIFE; 區別在於被遞增的變量是否在函數內被重置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM