JavaScript闭包变量仅初始化一次?

时间:2020-11-10 21:58:43

标签: javascript

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

您误解了代码。函数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