javascript - 闭包如何帮助函数了解前一个函数调用的私有(private)变量

标签 javascript

我试图理解闭包,我以为我理解了它,直到我遇到以下解决方案:

我不明白这将如何提醒 0、1、2、3、4、5

var next = (function(){
    var r = 0;
  return function(){
    return r++;
  }

})()

for (var i = 0; i<=5; i++){
    alert(next());
}

我明白第一次迭代是如何工作的,只有next,函数将执行并返回返回函数,然后next之后的额外()将执行返回的功能。 我还了解到,由于 Closure,执行时的返回函数将可以访问变量 r。

但是我不明白在下一次迭代中,r 的状态将如何持续存在。 在下一次 next() 再次运行时,r 变量将在函数范围内并且不会受到全局任何影响,这是怎么回事它知道 r 在前一个 next() 中的状态。即使是这样,var r = 0 不会将 r 重置为 0 吗?

最佳答案

外部 IIFE 仅运行一次,如末尾的 () 所示:

var next = (function(){
  var r = 0;
  return function(){
    return r++;
  }
})()
  ^^

因此,当解释器遇到 var next = ... 行时,IIFE 运行,创建 r 变量,然后返回以下函数:

function(){
  return r++;
}

next 被分配给调用 IIFE 的结果,IIFE 返回该函数。因此,将来,当您调用 next 时,您将调用上面的(小)函数 - 调用 next 不会再次调用整个 IIFE,并且只有r 变量的任何一个绑定(bind)。

如果 next 是一个创建了 r未调用函数,你是对的,每次调用 next 将为 r 创建一个具有新绑定(bind)的新函数:

var next = function(){
  var r = 0;
  return function(){
    return r++;
  }
}

for (var i = 0; i<=5; i++){
  var theFn = next();
  console.log(theFn());
}

关于javascript - 闭包如何帮助函数了解前一个函数调用的私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675773/

相关文章:

javascript - 将形状存储在 JavaScript 数组中以便在某些操作后重绘

javascript - 如何使用数据但隐藏它以使其无法重复使用

javascript - 正则表达式, "just group, don' t capture”,好像不行

javascript - 向页面传递 2 个或更多 URL 参数

javascript - Node.js 循环中的异步函数?

javascript - 为什么我在 node.js 类中得到未定义的实例?

javascript - Firefox WebExtension,独立的 HTML 覆盖

javascript - 如何在 Firebug 中调试事件监听器?

javascript - Node js 需要代码而不是文件

javascript - SAPUI5 元数据.xml : binding two entities