Javascript闭包变量只初始化一次?

Javascript闭包变量只初始化一次?,javascript,Javascript,简单的JS逻辑问题。。在下面的代码中,为什么add()只将计数器设置为0一次?我觉得每次调用函数时都应该将其重置为零 var add = (function () { var counter = 0; return function () {counter += 1; return counter} })(); add(); // 1 add(); // 2 谢谢 您误解了代码。函数add()不包含代码var counter=0 下面是对完全相同的代码的重写,使其更加清晰: var a

简单的JS逻辑问题。。在下面的代码中,为什么add()只将计数器设置为0一次?我觉得每次调用函数时都应该将其重置为零

var add = (function () {
  var counter = 0;
  return function () {counter += 1; return counter}
})();
add(); // 1
add(); // 2

谢谢

您误解了代码。函数
add()
不包含代码
var counter=0

下面是对完全相同的代码的重写,使其更加清晰:

var add;

// Note: THIS function is NOT add()
(function () {
  var counter = 0;

  // THIS function is add()
  add = function () {counter += 1; return counter}
})();

add(); // 1
add(); // 2
除了如何分配
add
之外,上述代码与原始代码的作用完全相同。在您的代码中,它是通过返回值赋值的,但在上面的代码中,我只是直接将其作为全局变量赋值,以便更清楚地知道哪个函数是
add()

另一种更像原始代码的方式是显式命名这两个函数:

var function1 = function () {
  var counter = 0;

  // The returned function is what will be assigned to add()
  return function () {counter += 1; return counter}
}; // Do not call it yet since calling it was what was confusing you

var add = function1();

add(); // 1
add(); // 2

因为
var计数器=0仅运行一次。在分配和调用内部函数时,会立即调用外部函数。添加一些
console.log
s并查看控制流。您使用的是IIFE立即调用的函数表达式,这意味着它会立即自执行,并且只执行一次,您不能像尝试那样显式调用它。正如@slebetman在回答中所说,当您调用add()时,您并不是在调用IIFE,而是在调用IIFE第一次执行时返回的函数,在该函数中,您是在递增计数器。这就是你的计数器值不断上升的原因。是的,在IIFE的情况下闭包的变量只初始化一次,因为IIFE只运行一次。这正是我想要的!非常感谢。我对生活一无所知。知道他们只执行一个解决了我的困惑。是时候用谷歌搜索更多关于它们的信息了