对了解闭包有一点帮助吗?

时间:2019-02-13 22:02:37

标签: javascript closures

在我正在做的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的变量无关紧要,也可以从返回的函数的历史记录中删除它。

闭包“写入”传递给它的值的想法,而不是想像似乎在缺勤中引用的变量/参数,很容易使我困惑。

我的问题是:这是一种考虑闭包的有效方法,还是我错过了一些东西?看来确实有点太简单了,我认为如果我的解释完全正确:

  1. 完全可以通过这种方式来教授闭包
  2. 当您调用返回的函数时,JavaScript控制台将显示“已填充”函数:
function retailPriceMaker(manufacturePrice) {
  return function(marketMultiplier) {
    return marketMultiplier * manufacturePrice;
  };
}

const retailPriceForNine = retailPriceMaker(9);

retailPriceForNine;
// ƒ (marketMultiplier) {
//    return marketMultiplier * 9;
//  }

那么,我想念什么(如果有的话)?还是我刚刚把每个人的世界颠倒了? (高度,完全不可能)

2 个答案:

答案 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 */
}

如果您考虑分配和释放,一切都会变得更加简单。

请注意:

  1. 没有闭包解释器,必须从函数返回后销毁值
  2. 关闭允许“违反”该规则。返回后不会销毁“ Closed”值
  3. 这个“技巧”本身很简单,但功能非常强大