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
依然不受影响。大概是为了最大程度防止外界的变量定义对所做封装的内部造成影响吧。
JS代码:
//方式一
(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
的语句都要去找一次最外层对象。