JavaScript:为什么只有在将return函数赋给变量时才会发生闭包?

san*_*e89 40 javascript closures

阅读之后你甚至不知道JSJavaScript: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
Run Code Online (Sandbox Code Playgroud)

Xin*_*Xin 70

_counter是函数内的局部变量counter().每次打电话counter()给新人_counter都会被创建.

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

  • 谢谢辛,后见之明看起来很明显. (3认同)
  • @sandre89 闭包属于具有该属性的一类概念:它们很难让你头脑清醒,但回想起来似乎非常明显,甚至微不足道。等到你进入monads... (3认同)

Yon*_*Noh 10

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

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