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

时间:2017-02-08 15:27:11

标签: javascript

我正在阅读this resource试图了解Javascript中闭包是如何工作的。

我理解每次在正常词法范围之外调用函数时,它会创建闭包,能够访问封闭的函数变量并使用它们来存储状态。

这适用于下面的my_module.incrCounter();(不断增加计数器),但为什么它在my_module.incrLocalCounter();中不起作用,每次都返回1?

incrLocalCounter内的IIFE不应该在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

  }

})();

2 个答案:

答案 0 :(得分:0)

您的“嵌套”IIFE每次都会记录1,因为在IIFE运行之前,递增的变量始终初始化为0。也就是说,在嵌套函数内部,local_counter始终从0开始。

如果您将var的{​​{1}}声明移到local_counter之外,那么您会看到它递增。或者,您可以让incrLocalCounter()返回函数并将其作为您返回的属性值:

incrLocalCounter()

答案 1 :(得分:0)

  

incrLocalCounter内的IIFE不应该在local_counter上创建闭包吗?

确实如此。 local_counter当时0。然后通过执行IIFE将其从0增加到1。然后它返回1。每次调用local_counter时,它都会执行相同的序列(包括设置0incrLocalCounter)。区别不在于incrLocalCounter有IIFE;不同之处在于是否在函数内重置正在递增的变量。