var generateClosure = function() {
var count = 0;
var get = function() {
count ++;
return count;
};
return get;
};
var counter = generateClosure();
console.log(counter());
console.log(counter());
console.log(counter());
count是 generateClosure函数内部的变量,它的生命周期就是generateClosure被调用的时期,当generateClosure从调用栈中返回时,count变量申请的空间也就被释放了。问题是,在generateClosure()调用结束后,counter()却引用了“已经释放了的”count变量,而且非但没有出错,反而每次调用counter()时还修改并返回了count。
这就是闭包的特性。当一个函数返回它内部定义的一个函数时,就产生了一个闭包,闭包不但包括被返回的函数,还包括这个函数的定义环境。当函数generateClosure()的内部函数get被一个外部变量counter引用时,counter和generateClosure()的局部变量就是一个闭包。
由于闭包机制的存在,即使外层的函数已经执行完毕,其作用域内申请的变量也不会释放,因为里层的函数还有可能引用到这些变量。
实现私有成员
我们可以把一个对象封装起来,只返回一个“访问器”的对象,即可实现对细节的隐藏。
本文介绍JavaScript中的闭包概念,解释了闭包如何让内部函数记住并访问其外部作用域中的变量,即使在外部函数已经执行完毕后仍能访问。通过一个简单的计数器示例展示了闭包的工作原理,并探讨了如何利用闭包实现对象的私有成员。
769

被折叠的 条评论
为什么被折叠?



