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."
所以,这里是不是暗示counter1
和counter2
都是闭包?如果是这样,那将与此处顶部提供的 '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?
没有。它指的是他们的方法。正如您所说,闭包始终是一个函数。
我们可以将句子重新表述为“每个计数器,counter1
和 counter2
,都保持与另一个的独立性。 每个对象上的闭包s 通过它自己的闭包引用不同版本的privateCounter
变量。"
(不过,这里的最后一个词"closure"并不是指功能,它只是关闭行为的实质[词法环境] ).
Is there anything inaccurate or incorrect with the above statements?
他们都很好。我唯一要提到的是,在“共享相同的闭包变量 - privateCounter
”中,您忘记了相同范围内的 changeBy
变量,并且与它分享。
首先,注意一下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."
所以,这里是不是暗示counter1
和counter2
都是闭包?如果是这样,那将与此处顶部提供的 '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
andcounter2
are each closures?
没有。它指的是他们的方法。正如您所说,闭包始终是一个函数。
我们可以将句子重新表述为“每个计数器,counter1
和 counter2
,都保持与另一个的独立性。 每个对象上的闭包s 通过它自己的闭包引用不同版本的privateCounter
变量。"
(不过,这里的最后一个词"closure"并不是指功能,它只是关闭行为的实质[词法环境] ).
Is there anything inaccurate or incorrect with the above statements?
他们都很好。我唯一要提到的是,在“共享相同的闭包变量 - privateCounter
”中,您忘记了相同范围内的 changeBy
变量,并且与它分享。