深入闭包
2012-07-09 13:48 江苏黑马 阅读(472) 评论(1) 收藏 举报- 什么是闭包?
现在有三个函数。a()、b()和c()。如果满足一下条件则构成闭包。
(1)函数b嵌套在函数a内部;
(2)函数a返回函数b。
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。 - 闭包的作用?
闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源。
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
示例代码:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>闭包</title> <script> function a(){ var i=0; function b(){ alert(++i); } return b; /*return ++i;*/ } var c = a(); </script> </head> <body> <input type="button" value="click" onClick="c();"> </body> </html>
运行后每点击一次按钮,返回从0开始每次加一的数值。
若是把b函数去掉,添加return ++i;则程序会报错:c不存在。这是因为前面定义的c已经被回收了。这就是垃圾回收机制。 - 闭包的应用场景。
(1)保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
(2)在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
以上两点是闭包最基本的应用场景,很多经典案例都源于此。 - 更为详细深入理解:http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html
浙公网安备 33010602011771号