1.什么是闭包?
函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回
function aaa(a){ var b = 5; function bbb(){ alert(a); alert(b); } } aaa();
//JS中的垃圾回收机制 function aaa(){ var a = 1; } aaa();
function aaa(){ var a = 5; function bbb(){ alert(a); } return bbb; } var c = aaa(); c();
2.闭包有什么好处?应用在那里?
1.希望一个变量长期驻扎在内存当中
2.避免全局变量的污染
3.私有成员的存在
1.模块化代码
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);
2.在循环中直接找到对应元素的索引
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); }*/ for(var i=0;i<aLi.length;i++){ aLi[i].onclick = (function(i){ return function(){ alert(i); } })(i); } };
3.闭包需要注意得地方?
//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; };