Javascript 什么';将全局对象作为参数传递给自执行函数的意义是什么?
我经常在Javascript库中看到这种模式:Javascript 什么';将全局对象作为参数传递给自执行函数的意义是什么?,javascript,Javascript,我经常在Javascript库中看到这种模式: (function (window, document, $, undefined) { window.foo = 'bar'; })(window, document, jQuery); 在本例中,传递window、document和jQuery有什么意义,因为它们是全局属性,可以直接访问,如下所示: (函数(){ window.foo='bar'; })(); console.log(foo)一个好处是,它允许库的缩小版本替换参数名
(function (window, document, $, undefined) {
window.foo = 'bar';
})(window, document, jQuery);
在本例中,传递window
、document
和jQuery
有什么意义,因为它们是全局属性,可以直接访问,如下所示:
(函数(){
window.foo='bar';
})();
console.log(foo)代码>一个好处是,它允许库的缩小版本替换参数名。例如:
(function (window) {
window.foo = 'bar';
})(window);
可以缩小到
(function(w){w.foo='bar'})(window);
(function(){window.foo='bar'})();
鉴于
(function () {
window.foo = 'bar';
})();
只能缩小到
(function(w){w.foo='bar'})(window);
(function(){window.foo='bar'})();
这并不是一个很大的进步。无法重命名全局对象,但可以重命名参数名称
将undefined
用作未传递给函数的参数可确保函数中对undefined
的引用实际上是undefined
,而不是一段疯狂的代码分配给名为undefined
的变量的其他值,例如:
(()=>{
//可能存在的荒谬代码:
常量未定义='foo';
//库代码:
//不起作用:
(() => {
让某人说出自己的名字;
//我们希望someVarName未定义,因为someVarName尚未分配给,但:
log(someVarName==未定义);
})();
})();代码>