san*_*e89 40 javascript closures
阅读之后你甚至不知道JS和JavaScript: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不是每次都新创建并且"记住"那里(这就是关闭发生的地方)
Yon*_*Noh 10
每次调用时counter()(),它都会创建一个新函数和一个新闭包.所以结果总是如此0.
相反,在var createClosure = counter();执行时,会创建一个函数和闭包并保存在变量中createClosure.下次调用时createClosure(),将调用保存的一个并使用创建的闭包.因此,结果是0,1,2,3,...