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; };