JavaScript匿名函數
所謂匿名函數就是沒有命名的函數,看起來有點難以理解,其實很常見,下面舉一個小例子。
這樣就創建了一個匿名函數,這個function沒有函數名,但可以被調用和執行,當網頁加載完畢時,會執行alert()。
(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。