JS 的function( window, undefined ) {}(window)寫法 (function( window, undefined ) {})(window);這個,為什麼要將window和undefined作為參數傳給它? (function( $, undefined ) { ...
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代碼 :1 var undefined = 8; 2 (function( window ) { 3 alert(window.undefined); // 8 4 alert(undefined); // 8 5 })(window);
與 Js代碼 :
1 var undefined = 8; 2 (function( window, undefined ) { 3 alert(window.undefined); // 8 4 alert(undefined); // 此處undefined參數為局部的名稱為undefined變數,值為undefined 5 })(window);
區分上述兩種方式:第一種每個語句都要去找一次window。第二種將window作為參數傳遞過去,是的不要每個語句都去找window,應該是提高了效率。 所以後者,就算外面的人把 undefined 定義了,裡面的 undefined 依然不受影響。大概是為了最大程度防止外界的變數定義對所做封裝的內部造成影響吧。
原文參考自博客https://www.cnblogs.com/ada-zheng/p/4174159.html
Js代碼:1 //方式一 2 (function(undefined ) { 3 window.property1 = ……; 4 window.property2 = ……; 5 …… 6 })(); 7 //方式二 8 (function( window, undefined ) { 9 ... // code goes here 10 11 })(window); 12 //方式三 13 (function(undefined ) { 14 var tmp = window; 15 tmp.property1 = ……; 16 tmp.property2 = ……; 17 …… 18 })();
方式一的效率明顯最低,方式二和方式三應該差不多。將window作為參數傳遞進去就可以讓代碼裡面的語句可以直接用參數中的window,而不用再去找最外層的對象。假如要在函數中為window再設置 100000個屬性,用參數傳遞過去只需要找一次最外層對象。不用參數傳遞,用到window的語句都要去找一次最外層對象。