在我正在做的Flatiron课程中,有以下示例:
function retailPriceMaker(manufacturePrice) {
return function(marketMultiplier) {
return marketMultiplier * manufacturePrice;
};
}
const retailPriceForNine = retailPriceMaker(9);
retailPriceForNine(2);
// 18
当然,本课程讨论如何声明retailPriceMaker
内的函数时,闭包如何访问(闭包)其作用域内的变量,即manufacturePrice
,并且即使在以后再叫。
我确实了解这一点,甚至使我的大脑受伤。
让我更简单的一种方法是这样思考:
retailPriceMaker(9)
返回以下函数:
function(marketMultiplier) {
return marketMultiplier * 9;
};
哪里有一个名为manufacturePrice
的变量无关紧要,也可以从返回的函数的历史记录中删除它。
闭包“写入”传递给它的值的想法,而不是想像似乎在缺勤中引用的变量/参数,很容易使我困惑。
我的问题是:这是一种考虑闭包的有效方法,还是我错过了一些东西?看来确实有点太简单了,我认为如果我的解释完全正确:
function retailPriceMaker(manufacturePrice) {
return function(marketMultiplier) {
return marketMultiplier * manufacturePrice;
};
}
const retailPriceForNine = retailPriceMaker(9);
retailPriceForNine;
// ƒ (marketMultiplier) {
// return marketMultiplier * 9;
// }
那么,我想念什么(如果有的话)?还是我刚刚把每个人的世界颠倒了? (高度,完全不可能)
答案 0 :(得分:2)
不,这太简单了。当然,在很多情况下,封闭变量是一个常量,也可以填充。但是通常,您需要考虑它是在 mutable 变量之上封闭的:
var count = 0;
function increment() { // yes, this is a closure as well - `count` is in its scope
count++;
}
console.log(count);
increment();
console.log(count);
increment();
console.log(count);
答案 1 :(得分:0)
闭包实际上是一个非常简单的概念,具有强大的后果。
我不是编程语言的历史学家,不能提供不同语言的比较分析,但是我认为它们的处处几乎与1975年Sussman和Steel的Scheme规范中定义的相同。
那么我们如何用最简单的方式描述闭包呢?
这只是一个技巧,可以“打破规则”可变的生命周期。
让我们看看您的示例:
/* 1. Each function have an own "namespace" where variables lives
2. After `return` from a function it's namespace *must* be destroyed in "normal" cases
and every value *must* be deallocated */
function retailPriceMaker(manufacturePrice) {
/* 3. manufacturePrice - *must* be deallocated
after return from retailPriceMaker */
return function(marketMultiplier) {
/* 4. But closures allows to "break" this rule
and languages that supports closures
do not deallocate "closed" values */
return marketMultiplier * manufacturePrice;
};
/* 5. manufacturePrice value here remains closed
and not deallocated after return */
}
如果您考虑分配和释放,一切都会变得更加简单。
请注意: