- /**
- * 一:什么是闭包
- * 1:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回
- * 例一:
- *
- * 二:闭包有什么好处
- * 1:希望变量长期驻扎在内存中
- * 2:避免全局变量的污染 例二
- * 3:私有成员的存在
- *
- * 用法:
- * 1:代码模块化 例三
- * 2:可以在循环中直接找到对应元素的索引(例四)
- *
- * 三:闭包需要注意的地方
- * 在ie下会引发内存泄露 (关于内存泄露问题,文章底部)
- */
- // 例一start:
- function aaa(a) {
- var b = 5;
- function bbb() {
- alert(a);
- alert(b);
- }
- }
- aaa() //当函数执行后变量不会被垃圾回收机制所收回,因为在函数内部所调用
- // js中的垃圾回收机制
- function ccc() {
- var a = 1;
- }
- ccc(); //当函数执行后变量就会被js中的垃圾回收机制所收回
- // 例一end:
- //
- // 例二start:
- var a = 1;
- function ddd() {
- a++;
- alert(a);
- }
- ddd(); //2
- ddd(); //3
- alert(a) //3
- function eee() {
- var a = 1;
- a++;
- alert(a);
- }
- eee(); //2
- eee(); //2
- // 那么怎么可以做到,让a即是局部变量,又可以叠加:so:闭包
- function aaa() {
- var a = 1;
- return function bbb() {
- a++;
- alert(a);
- }
- }
- var b = aaa();
- b() //2
- b() //3
- alert(a) //报错
- // 例二end:
- // 例三start
- var aaa = (function() {
- var a = 1;
- function bbb() {
- a++;
- alert(a);
- }
- function ccc() {
- a++;
- alert(a);
- }
- return {
- b: bbb,
- c: ccc
- }
- })();
- aaa.b();
- aaa.c();
- // 例三end
- // 例四start
- for (var i = 0; i < oLi.length; i++) { (function(i) {
- oLi[i].onclick = function() {
- alert(i);
- }
- })(i)
- }
- //或者
- for (var i = 0; i < oLi.length; i++) {
- oLi.onclick = (function(i) {
- return function() {
- alert(i);
- }
- } (i))
- }
- // 例四end
来源: http://lib.csdn.net/snippet/javascript/39146