分析:
1、所謂匿名函數,從字面意思理解,就是沒有名字的函數,js 用()來代替(注意,是英文狀態下的括號)
2、定義形式:
function (){ //to add codes that you want to add }
3、匿名函數作用
(1)與閉包函數相比較,最大作用是不污染全局對象,一旦執行完畢,GC自動回收內存,這是與閉包函數本質的區別。閉包函數的一大特點是:
變量常駐內存,只有關閉浏覽器時,才釋放。
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
在如上這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,並沒有在f1調用後被自動清除。
為什麼會這樣呢?原因就在於f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,而f2的存在依賴於f1,因此f1也始終在內存中,不會在調用結束後,被垃圾回收機制(garbage collection)回收。
這段代碼中另一個值得注意的地方,就是“nAdd=function(){n+=1}”這一行,首先在nAdd前面沒有使用var關鍵字,因此 nAdd是一個全局變量,而不是局部變量。其次,nAdd的值是一個匿名函數(anonymous function),而這個
匿名函數本身也是一個閉包,所以nAdd相當於是一個setter,可以在函數外部對函數內部的局部變量進行操作。
(2)與一般函數相比較,不執行預編譯。
function fuc() { fuc1(); //foo被提到了作用域的最前面, 於是這裡可以正常調用foo函數 fuc2(); //這裡會報錯bar是個undefined function fuc1() {alert("foo()") } var fuc2 = function () { alert("bar")}; }
Code:
匿名函數的幾種表現形式:
模式一:函數字面量 (Function Literal)
先聲明函數對象,然後執行。
(function(){ // insert code here })();
模式二:優先表達式 (Prior Expression)
由於 JavaScript 按照從內到外的順序執行表達式,因此使用括號來強制執行已聲明的函數。
(function(){ // insert code here }());
模式三:Void 操作符 (Void Operator)
使用 Void 操作符執行一個單獨的操作數。
void function(){ // insert code here }();