Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么嵌套的IIFE不创建闭包?_Javascript - Fatal编程技术网

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

Javascript 为什么嵌套的IIFE不创建闭包?,javascript,Javascript,我正在阅读,试图理解闭包在Javascript中是如何工作的 我知道,每次在函数的正常词法范围外调用函数时,它都会创建闭包,能够访问封闭的函数变量并使用它们存储状态 这在my_module.incrCounter()中起作用(它不断增加计数器),但为什么它在my_module.incrLocalCounter()中不起作用,每次都返回1 本地计数器中的iLife不应该在本地计数器上创建闭包吗 var my_module = (function tlModule(){ var counter

我正在阅读,试图理解闭包在Javascript中是如何工作的

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

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

本地计数器
中的iLife不应该在
本地计数器上创建闭包吗

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\u计数器的
var
声明移动到外部
incrLocalCounter()
,则会看到它递增。或者,您可以让
incrLocalCounter()
返回一个函数,并将其作为您返回的属性值:

function incrLocalCounter(){

  var local_counter = 0;

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

};

return {

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

}
rlocalCounter()中的函数{ var本地计数器=0; 返回函数(){ 本地计数器++ console.log(本地_计数器) }; }; 返回{ 递增计数器:递增计数器, incrLocalCounter:incrLocalCounter()// 本地计数器
中的iLife不应该在
本地计数器上创建闭包吗

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

  }

})();
是的。
local\u counter
当时处于
0
。然后通过执行IIFE将其从
0
增加到
1
。然后返回
1
。并执行相同的顺序(包括将
local\u counter
设置为
0
)每次调用
incrLocalCounter
。区别不在于
incrLocalCounter
有生命;区别在于正在递增的变量是否在函数内重置。

每次在其正常词法范围外调用函数时,它都会创建闭包-这不是真正正确的n调用基本上总是创建一个闭包,尽管在许多情况下闭包是空的。