原文地址:http://itping.iteye.com/blog/1679783

 

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); 
var undefined = 8;
(function( window ) { 
    alert(window.undefined); // 8
    alert(undefined); // 8
})(window);

Js代码 复制代码 收藏代码
  1. var undefined = 8;  
  2. (function( window, undefined ) {   
  3.     alert(window.undefined);  // 8  
  4.     alert(undefined); // 此处undefined参数为局部的名称为undefined变量,值为undefined  
  5. })(window); 
var undefined = 8;
(function( window, undefined ) { 
    alert(window.undefined);  // 8
    alert(undefined); // 此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);

区分上述两种方式:第一种每个语句都要去找一次window。第二种将window作为参数传递过去,是的不要每个语句都去找window,应该是提高了效率。所以后者,就算外面的人把 undefined 定义了,里面的 undefined 依然不受影响。大概是为了最大程度防止外界的变量定义对所做封装的内部造成影响吧。

 

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. })(); 
//方式一
(function(undefined ) {
   window.property1 = ……;
   window.property2 = ……;
   ……
})();
//方式二
(function( window, undefined ) {
    ... // code goes here

})(window);
//方式三
(function(undefined ) {
   var tmp = window;
   tmp.property1 = ……;
   tmp.property2 = ……;
   ……
})();

方式一的效率明显最低,方式二和方式三应该差不多。将window作为参数传递进去就可以让代码里面的语句可以直接用参数中的window,而不用再去找最外层的对象。假如要在函数中为window再设置 100000个属性,用参数传递过去只需要找一次最外层对象。不用参数传递,用到window的语句都要去找一次最外层对象。