什么是闭包?
函数嵌套函数,闭包中的变量不会被垃圾回收机制回收;
闭包是一个有权访问另一个函数作用域中变量的函数;
闭包有什么好处?变量常驻内存;避免全局变量污染;模块化代码
1 //~~~一般 2 function aaa(){ 3 var a = 1; 4 a ++; 5 alert(a); 6 } 7 aaa();//2 8 aaa();//2
1 //~~~常驻内存 2 function aaa(){ 3 var a = 1; 4 return function(){ 5 a ++; 6 alert(a); 7 } 8 } 9 var bbb =aaa(); 10 bbb();//2 >> 常驻内存 11 bbb();//3
1 //~~~改造 2 var aaa =(function(){ 3 var a = 1; 4 return function(){ 5 a ++; 6 alert(a); 7 } 8 })();//先自执行一次 9 aaa();//2 10 aaa();//3
1 //~~~私有方法,模块化代码 2 var aaa =(function(){ 3 var a = 1; 4 function bbb(){ 5 a ++; 6 alert(a); 7 } 8 function ccc(){ 9 a ++; 10 alert(a); 11 } 12 return { 13 b : bbb, 14 c : ccc 15 }; 16 })();//先自执行一次 17 aaa.b(); 18 aaa.c();
1 //~~~常用 2 var aLi = document.getElementsByTagName("li"); 3 for(var i = 0;i < aLi.length;i ++){ 4 // aLi[i].onclick = (function(i){ 5 // return function(){ 6 // console.log(i); 7 // } 8 // })(i);//先自执行一次 9 10 (function(i){ 11 aLi[i].onclick = function(){ 12 console.log(i); 13 }; 14 })(i); 15 }
IE下内存泄漏
1 //~~~way1 2 var oDiv = document.getElementById("div1"); 3 var id = oDiv.id; 4 oDiv.onclick = function(){ 5 alert(id); 6 }; 7 oDiv = null;
1 //~~~way2 2 var oDiv = document.getElementById("div1"); 3 oDiv.onclick = function(){ 4 alert(oDiv.id);//互相引用引发内存泄漏 5 }; 6 window.onunload = function(){ 7 oDiv.onclick = null; 8 };