javascript的匿名函數與閉包

JavaScript匿名函數
所謂匿名函數就是沒有命名的函數,看起來有點難以理解,其實很常見,下面舉一個小例子。

window.οnlοad=function(){ alert("加載完畢!");}

這樣就創建了一個匿名函數,這個function沒有函數名,但可以被調用和執行,當網頁加載完畢時,會執行alert()。

<script language="javascript" type="text/javascript">
(function(x,y){alert(x+y)})(2,3);   //顯示結果爲5
</script>

上面的方法仍然是創建了一個匿名函數,並使用()優先表達式強制執行函數。

JavaScript閉包(closure)
閉包其實就是利用了函數作用域和匿名函數的知識,當函數A執行結束時,一部分變量變量被B引用,被引用的變量不能釋放,形成了所謂的閉包。這裏有篇很好的文章,可以參考一下。
下面看一個小例子:
<script language="javascript" type="text/javascript">
function show(){
     var n=3;
     setTimeout(function(){alert("first:"+n);},3000); //3秒後顯示first:3
     alert("second:"+n); //顯示second:3
}
show();
function show2(){alert("第一個函數執行結束");}
show2();
</script>

運行上面的函數後,首先alert顯示"second:3",然後顯示"第一個函數執行結束",3秒後顯示“first:3”。

仔細看一下,函數show執行結束的時候,變量n應該被釋放了,內存裏也就不存在了,怎麼過了3秒還能顯示出"first:3"呢?閉包恰恰就在此產生了,當函數show執行結束的時候,想要釋放內存裏的n,但發現變量n還在被一個匿名函數引用,要在3秒後調用,根據JavaScript閉包原理,內存裏的n被保留了下來,於是在三秒以後仍然可以調用n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章