【问题标题】:JavaScript: Why does closure only happen if I assign the return function to a variable?JavaScript:为什么只有将返回函数分配给变量时才会发生闭包?
【发布时间】:2017-11-17 03:21:57
【问题描述】:

即使在阅读了You don't know JSJavaScript: The Core 之后,我仍然无法理解以下代码的行为。

为什么,当我调用counter()() 时,我没有得到闭包,但是如果我为counter() 的结果分配一个变量,比如var getClosure = counter(),那么我在调用getClosure() 时得到一个闭包?

function counter() {

    var _counter = 0;

    function increase() { return _counter++ }

    return increase;
}

// Double ()() to call the returned function always return 0, so no closure. 
counter()() // returns 0
counter()() // returns 0
counter()() // returns 0
counter()() // returns 0

var createClosure = counter();

createClosure() // returns 0
createClosure() // returns 1
createClosure() // returns 2
createClosure() // returns 3

【问题讨论】:

  • counter() 每次都创建一个新的闭包?

标签: javascript closures


【解决方案1】:

每次调用counter()(),它都会创建一个新函数和一个新闭包。 所以结果总是0

相反,当var createClosure = counter();被执行时,一个函数和闭包被创建并保存在变量createClosure中。下次调用createClosure() 时,会调用保存的闭包并使用创建的闭包。因此结果是0, 1, 2, 3, ...

【讨论】:

    【解决方案2】:

    _counter 是函数counter() 中的局部变量。每次调用counter() 时,都会创建一个新的_counter

    但是var createClosure = counter() 只调用了函数 1 次,这就是为什么 _counter 不是每次都新创建并在那里“记住”(这就是发生关闭的地方)

    【讨论】:

    • 谢谢欣,事后看来如此明显。
    • @sandre89 闭包属于具有该属性的一类概念:它们很难绕开你的大脑,但回想起来似乎非常明显,甚至微不足道。等到你到达 monads...
    【解决方案3】:

    换句话说,counter() 函数的返回值(即闭包)不会被持久化,或者当您按原样调用函数时它会被丢弃。

    但是在将该返回值分配给 var createClosure 之后。您可以根据需要多次调用闭包

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      相关资源
      最近更新 更多