標籤:
JS 關於(function( window, undefined ) {})(window)寫法的理解 [網路整理]
(function( window, undefined ) {})(window);這個,為什麼要將window和undefined作為參數傳給它?(function( $, undefined ) {})(jQuery); 同理因為 ecmascript 執行JS代碼是從裡到外,因此把全域變數window或jQuery對象傳進來,就避免了到外層去尋找,提高效率。undefined在老一輩的瀏覽器是不被支援的,直接使用會報錯,js架構要考慮到相容性,因此增加一個形參undefined。還有,不要用window.undefined傳遞給形參,有可能window.undefined被其他人修改了,最好就是甚麼都不傳,形參的undefined就是真正的undefined了。Js代碼 : var undefined = 8; (function( window ) { alert(window.undefined); // 8 alert(undefined); // 8 })(window); 與Js代碼 : var undefined = 8; (function( window, undefined ) { alert(window.undefined); // 8 alert(undefined); // 此處undefined參數為局部的名稱為undefined變數,值為undefined })(window); 區分上述兩種方式:第一種每個語句都要去找一次window。第二種將window作為參數傳遞過去,是的不要每個語句都去找window,應該是提高了效率。 所以後者,就算外面的人把 undefined 定義了,裡面的 undefined 依然不受影響。大概是為了最大程度防止外界的變數定義對所做封裝的內部造成影響吧。 原文參考自站長網http://www.software8.co/wzjs/Javascript/2525.html
在jquery中我們經常看到以下這段代碼:
;(function ( $, window, document, undefined ){
//函數體內具體代碼
})(jQuery, window,document);
首先說說非常值得提倡的幾點:
1、代碼最前面的分號,可以防止多個檔案壓縮合并以為其他檔案最後一行語句沒加分號,而引起合并後的語法錯誤。
2、匿名函數(function(){})();:由於Javascript執行運算式是從圓括弧裡面到外面,所以可以用圓括弧強制執行聲明的函數。避免函數體內和外部的變數衝突。
3、$實參:$是jquery的簡寫,很多方法和類庫也使用$,這裡$接受jQuery對象,也是為了避免$變數衝突,保證外掛程式可以正常運行。
4、window, document實參分別接受window, document對象,window, document對象都是全域環境下的,而在函數體內的window, document其實是局部變數,不是全域的window, document對象。這樣做有個好處就是可以提高效能,減少範圍鏈的查詢時間,如果你在函數體內需要多次調用window 或 document對象,這樣把window 或 document對象當作參數傳進去,這樣做是非常有必要的。當然你如果你的外掛程式用不到這兩個對象,那麼就不用傳遞這兩個參數了。
5、最後剩下一個undefined形參了,那麼這個形參是幹什麼用的呢,看起來是有點多餘。undefined在老一輩的瀏覽器是不被支援的,直接使用會報錯,js架構要考慮到相容性,因此增加一個形參undefined
JS 關於(function( window, undefined ) {})(window)寫法的理解【轉】