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

JavaScript:为什么只有将返回函数赋给变量时才会发生闭包?,javascript,closures,Javascript,Closures,即使在阅读之后,我仍然无法理解以下代码的行为 为什么,当我调用counter()()时,我没有得到闭包,但是如果我给counter()的结果分配了一个变量,比如var getClosure=counter(),那么我在调用getClosure()时会得到闭包 每次调用counter()(),它都会创建一个新函数和一个新闭包。 因此结果总是0 相反,当var createClosure=counter()时时,将创建函数和闭包,并将其保存在变量createClosure中。下次调用createCl

即使在阅读之后,我仍然无法理解以下代码的行为

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


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


相反,当
var createClosure=counter()时时,将创建函数和闭包,并将其保存在变量
createClosure
中。下次调用
createClosure()
时,将调用保存的闭包并使用创建的闭包。因此,结果是
0
1
2
3
,…

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


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

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

但是,在将该返回值赋给


var createClosure
。您可以根据需要多次调用闭包

counter()
每次都创建一个新的闭包?谢谢Xin,事后看来很明显。@sandre89闭包属于一类具有该属性的概念:它们很难让您的大脑思考,但在回顾时似乎非常明显,甚至微不足道。等到你找到monads。。。
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