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