js匿名函式括號的作用
詳細解釋請看原文。我覺得還是挺有幫助的。我主要摘抄了部分主要內容,加了部分自己的理解:
( function(){…} )()和( function (){…} () )是兩種javascript立即執行函式的常見寫法,最初我以為是一個括號包裹匿名函式,再在後面加個括號呼叫函式,最後達到函式定義後立即執行的目的。後來明白,要在函式體後面加括號就能立即呼叫,則這個函式必須是函式表示式,不能是函式宣告。
在function前面加!、+、 -甚至是逗號等到都可以起到函式定義後立即執行的效果,而()、!、+、-、=等運算子,都將函式宣告轉換成函式表示式,消除了javascript引擎識別函式表示式和函式宣告的歧義,告訴javascript引擎這是一個函式表示式,不是函式宣告,可以在後面加括號,並立即執行函式的程式碼。接下來看看匿名韓輸的幾種寫法。
匿名函式寫法一:
-
(function(){
-
//do something
-
}())
匿名函式寫法二:
-
(function(){
-
//do something
-
})();
匿名函式寫法三:
-
!function(){ //可以把!換成+、-、=等
-
//do something
-
}();
匿名函式寫法四:
-
void function(){
-
//do something
-
}();
加括號是最安全的做法,因為!、+、-等運算子還會和函式的返回值進行運算,有時造成不必要的麻煩。
加括號的兩種寫法中,一定要注意匿名函式的前面一定好有分號,否則有可能引發錯誤。先看下寫法一。下面的a函式會把後面的匿名函式作為引數傳入a,導致a直接變成undefined,而不是一個函式。
-
var a =function(value){alert(value);} //value值為undefined。因為沒有返回值,a也變成undefined
-
(function(){
-
alert(1);
-
}());
再看下寫法二,下面的程式碼會丟擲錯誤“Uncaught TypeError: (intermediate value)(...) is not a function(…)”。 上例中就出現了錯誤,這就是因為a函式會把他後面的匿名函式作為引數傳入a中,這也就解釋了為什麼有人習慣在匿名函式之前新增;了,就是為了防止上文沒有嚴格遵循javascript語法,漏掉;的問題。
-
var a = function(){}
-
(function(){
-
alert(1);
-
})(); //丟擲錯誤。最後面的()沒有應用在函式上。Uncaught TypeError: (intermediate value)(...) is not a function(…)
javascript中沒用私有作用域的概念,如果在多人開發的專案上,你在全域性或區域性作用域中聲明瞭一些變數,可能會被其他人不小心用同名的變數給覆蓋掉,根據javascript函式作用域鏈的特性,可以使用這種技術可以模仿一個私有作用域,用匿名函式作為一個“容器”,“容器”內部可以訪問外部的變數,而外部環境不能訪問“容器”內部的變數,所以( function(){…} )()內部定義的變數不會和外部的變數發生衝突,俗稱“匿名包裹器”或“名稱空間”。
JQuery使用的就是這種方法,將JQuery程式碼包裹在 ( function (window,undefined){…jquery程式碼…} (window))中,在全域性作用域中呼叫JQuery程式碼時,可以達到保護JQuery內