闭包
1.什么是闭包?
函数嵌套函数,内部函数可以引用外部函数的参数和变量.参数和变量不会被垃圾回收机制所收回.
function aaa(){ var a =5; function bbb(){ alert(a); } return bbb; } var c = aaa(); c();
2.闭包有什么好处?应用在哪里?
好处:
希望一个变量长期驻扎在内存当中.
可以避免全局变量的污染.
私有成员的存在.
function aaa(){ var a =1; return function(){ a++; alert(a); } } var b= aaa(); b(); // 2 b(); //3
用法:
模块化代码
在循环中直接找到对应元素的索引.
//模块化代码 var aaa = (function(){ var a =1; return function(){ a++; alert(a); } })(); aaa();//2 aaa();//3
var aaa = (function(){ var a =1; function bbb(){ a++; alert(a); } function ccc(){ a++; alert(a); } return { b:bbb, c:ccc } })(); aaa.b();//2 aaa.c();//3 //下面的三个报错 alert(a); alert(bbb); alert(ccc);
window.onload=function(){ var aLi = document.getElementsByTagName('li'); for(var i=0;i<aLi.length;i++){ // (function(i){ // aLi[i].onclick = function(){ // alert(i); // } // })(i); aLi[i].onclick = (function(i){ return function(){ alert(i); } })(i); } }
3.闭包需要注意的地方?
IE下会引发内存泄露. fuck ie.
// window.onload=function(){ // var oDiv = document.getElementById('div1'); // oDiv.onclick = function(){ // alert(oDiv.id); // }; // window.onunload = function(){ // oDiv.onclick = null; // } // } window.onload = function(){ var oDiv = document.getElementById('div1'); var id = oDiv.id; oDiv.onclick = function(){ alert(id); } oDiv=null; }