这是JavaScript的一种常见做法:
(function($) {
...code...
})(jQuery);
我了解包装函数(它防止污染全局名称空间),但是许多库(例如jQuery,Underscore等)已经在全局范围内定义了短名称(分别为
$
和_
)供我使用。我想知道这种方法的优点是什么。只是将jQuery
重命名为更短的内容?阻止我覆盖$
?使以后更容易在另一个库中交换?我想这些似乎都不会让我信服。此外,我也看到了这一点:
(function(_) {
...code...
})(_);
这里什么都没有重命名。我什至看到:
(function(global) {
...code...
})(this); // or window, perhaps
直接使用
window
有什么问题?所以这是我要问的:
这种做法有名字吗?
这种做法有什么好处?
我是否应该始终传递正在使用的库,而不是直接使用它们?
我应该传递
this
或window
作为对全局范围的引用吗? 最佳答案
这种做法有名字吗?
该语法称为自执行匿名函数。我不知道用于将全局对象传递给函数的任何特殊名称。
这种做法有什么好处?
如前所述,该函数中的var
作用域变量将
帮助整理全局名称。jQuery
示例通常在插件中使用,以便插件可以使用$
并同时与$.noConflict()
(docs)兼容
(function($) {
...code...
})(jQuery);
通常,将全局或保留对象(例如
window
,document
)作为参数传递可以帮助缩小脚本后减小脚本的大小:(function(window, document) {
// A JS minifier can now minify the all occurrences of `window` and
// `document` within this function.
})(window, document);
我是否应该始终传递正在使用的库,而不是直接使用它们?
我应该在此窗口中引用全局范围吗?
仅当最小化或冲突的库变量名是一个问题时。