封閉函數(shù)是javascript中匿名函數(shù)的另外一種寫法,創(chuàng)建一個(gè)一開始就執(zhí)行而不用命名的函數(shù)搞疗。
一般定義的函數(shù)和執(zhí)行函數(shù):
function changecolor(){
? ? var oDiv = document.getElementById('div1');
? ? oDiv.style.color = 'red';
}
changecolor();
封閉函數(shù):
(function(){
? ? var oDiv = document.getElementById('div1');
? ? oDiv.style.color = 'red';
})();
還可以在函數(shù)定義前加上“~”和“!”等符號(hào)來(lái)定義匿名函數(shù)
!function(){
? ? var oDiv = document.getElementById('div1');
? ? oDiv.style.color = 'red';
}()
閉包
什么是閉包
函數(shù)嵌套函數(shù),內(nèi)部函數(shù)可以引用外部函數(shù)的參數(shù)和變量喻鳄,參數(shù)和變量不會(huì)被垃圾回收機(jī)制收回
function aaa(a){? ? ?
? ? ? var b = 5;? ? ?
? ? ? function bbb(){
? ? ? ? ? a++;
? ? ? ? ? b++;
? ? ? ? alert(a);
? ? ? ? alert(b);
? ? ? }
? ? ? return bbb;
? }
var ccc = aaa(2);
ccc();
ccc();
改寫成封閉函數(shù)的形式:
var ccc = (function(a){
? var b = 5;
? function bbb(){
? ? ? a++;
? ? ? b++;
? ? alert(a);
? ? alert(b);
? }
? return bbb;
})(2);
ccc();
ccc();
用處
1郊酒、將一個(gè)變量長(zhǎng)期駐扎在內(nèi)存當(dāng)中,可用于循環(huán)中存索引值
<script type="text/javascript">
? ? 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);
? ? ? ? }
? ? }
</script>
<ul>
? ? <li>111</li>
? ? <li>222</li>
? ? <li>333</li>
? ? <li>444</li>
? ? <li>555</li>
</ul>
2嗓奢、私有變量計(jì)數(shù)器讼撒,外部無(wú)法訪問(wèn),避免全局變量的污染
<script type="text/javascript">
var count = (function(){
? ? var a = 0;
? ? function add(){
? ? ? ? a++;
? ? ? ? return a;
? ? }
? ? return add;
})()
count();
count();
var nowcount = count();
alert(nowcount);
</script>