即使在阅读You don't know JS和JavaScript: 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
答案 0 :(得分:70)
_counter
是函数counter()
中的局部变量。每次拨打counter()
时,都会创建新的_counter
。
但是var createClosure = counter()
只调用了1次这个函数,这就是为什么_counter
不是每次都是新创建的,并且记得'那里(关闭发生的地方)
答案 1 :(得分:10)
每次都会调用counter()()
,它会创建一个新函数和一个新闭包。
所以结果总是0
。
相反,当执行var createClosure = counter();
时,会在变量createClosure
中创建一个函数和闭包并保存。下次调用createClosure()
时,将调用保存的一个并使用创建的闭包。因此,结果为0
,1
,2
,3
,...
答案 2 :(得分:1)
换句话说,$table->timestamp('created_at')->useCurrent();
函数的返回值(即闭包)不会被持久化,或者只是在按原样调用函数时被丢弃。
然而,在将该返回值分配给counter()
之后。您可以根据需要多次调用闭包