为什么嵌套的IIFE不创建闭包?

我正在阅读这个资源,试图了解在Javascript中闭包是如何工作的。

我明白,每当函数被调用超出其正常的词法范围时,它就会创建闭包,能够访问封闭函数变量并使用它们来存储状态。

这适用于my_module.incrCounter(); 下面(它不断增加计数器),但为什么它不能在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; 不同之处在于变量是否在函数中被重置。

链接地址: http://www.djcxy.com/p/51615.html

上一篇: Why a nested IIFE is not creating closure?

下一篇: JavaScript Dynamic Closure Scope