Javascript 闭包和术语

Javascript Closures and terminology

首先,注意一下MDN对闭包的定义:

A closure is the combination of a function and the lexical environment within which that function was declared.

在下面的代码中,作为 IIFE 的结果产生了一个单例。

var counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  };   
})();

console.log(counter.value()); // logs 0
counter.increment();
counter.increment();
console.log(counter.value()); // logs 2
counter.decrement();
console.log(counter.value()); // logs 1

然后说"those three public functions (increment, decrement, and value) are closures that share the same lexical environment"。

换句话说,如果我理解正确的话: 以下methods/functions:increment, decrement and value每个,本身就是闭包?

看下一段代码,这里没有 IIFE,而是一个函数工厂:

var makeCounter = function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }  
};

var counter1 = makeCounter();
var counter2 = makeCounter();
alert(counter1.value()); /* Alerts 0 */
counter1.increment();
counter1.increment();
alert(counter1.value()); /* Alerts 2 */
counter1.decrement();
alert(counter1.value()); /* Alerts 1 */
alert(counter2.value()); /* Alerts 0 */

"Each of the counters, counter1 and counter2, maintains its independence from the other. Each closure references a different version of the privateCounter variable through its own closure."

所以,这里是不是暗示counter1counter2都是闭包?如果是这样,那将与此处顶部提供的 'closure' 是什么的定义不一致?

所以在第一个代码(具有 IIFE)中,MDN 说每个正在 returned 的内部 函数 都是闭包。 但是,在第二个代码(具有函数工厂)中,MDN 似乎在说 variables 引用了 returned 对象(包含 3 个方法或函数属性:increment, decrement and value),即闭包?

最终,显然无论是 IIFE 还是函数工厂都不会影响 'closure' 的定义,但是页面上的评论并没有让我弄清楚到底是什么这里的闭包?

根据上面闭包的 MDN 定义,认为闭包是:

在第一个代码中,increment, decrement and value 函数是 each 形成的闭包(其中所有 3 个都共享相同的词法环境 - 因此共享相同的闭包变量 - 'privateCounter').

在第二个代码中,increment, decrement and value 函数是 each 形成的闭包(其中所有 3 个都共享相同的词法环境 - 因此共享相同的闭包变量 - 'privateCounter')。 但是,由于 makeCounter() 被调用 两次 ,其 return 值设置为两个不同的变量,因此会有 两个 sets of those 3 closures formed (i.e. 6 closures, if you like), each set 共享相同的词法环境(privateCounter 变量)。

这是我从 MDN 定义中了解到的,但我对第二个代码中的闭包实际上是什么有疑问。说第二个代码中只有两个闭包肯定更容易理解吧? 但是这么说,你不是在暗示 object 被 returned 是一个闭包,可以说,objects 不能形成或成为闭包的一部分?

tl;dr:这两组代码中的闭包是什么?

对此进行澄清会很好。

你的理解是正确的。

Thus, here, is it implying that counter1 and counter2 are each closures?

没有。它指的是他们的方法。正如您所说,闭包始终是一个函数。

我们可以将句子重新表述为“每个计数器,counter1counter2,都保持与另一个的独立性。 每个对象上的闭包s 通过它自己的闭包引用不同版本的privateCounter变量。"

(不过,这里的最后一个词"closure"并不是指功能,它只是关闭行为的实质[词法环境] ).

Is there anything inaccurate or incorrect with the above statements?

他们都很好。我唯一要提到的是,在“共享相同的闭包变量 - privateCounter”中,您忘记了相同范围内的 changeBy 变量,并且与它分享。