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

时间:2017-11-17 03:21:57

标签: javascript closures

即使在阅读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

3 个答案:

答案 0 :(得分:70)

_counter是函数counter()中的局部变量。每次拨打counter()时,都会创建新的_counter

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:1)

换句话说,$table->timestamp('created_at')->useCurrent(); 函数的返回值(即闭包)不会被持久化,或者只是在按原样调用函数时被丢弃。

然而,在将该返回值分配给counter()之后。您可以根据需要多次调用闭包