这是JavaScript的一种常见做法:

(function($) {
    ...code...
})(jQuery);


我了解包装函数(它防止污染全局名称空间),但是许多库(例如jQuery,Underscore等)已经在全局范围内定义了短名称(分别为$_)供我使用。我想知道这种方法的优点是什么。只是将jQuery重命名为更短的内容?阻止我覆盖$?使以后更容易在另一个库中交换?我想这些似乎都不会让我信服。

此外,我也看到了这一点:

(function(_) {
    ...code...
})(_);


这里什么都没有重命名。我什至看到:

(function(global) {
    ...code...
})(this); // or window, perhaps


直接使用window有什么问题?

所以这是我要问的:


这种做法有名字吗?
这种做法有什么好处?
我是否应该始终传递正在使用的库,而不是直接使用它们?
我应该传递thiswindow作为对全局范围的引用吗?

最佳答案

这种做法有名字吗?

该语法称为自执行匿名函数。我不知道用于将全局对象传递给函数的任何特殊名称。

这种做法有什么好处?


如前所述,该函数中的var作用域变量将
帮助整理全局名称。
jQuery示例通常在插件中使用,以便插件可以使用$并同时与$.noConflict() (docs)兼容

(function($) {
    ...code...
})(jQuery);

通常,将全局或保留对象(例如windowdocument)作为参数传递可以帮助缩小脚本后减小脚本的大小:

(function(window, document) {
    // A JS minifier can now minify the all occurrences of `window` and
    // `document` within this function.
})(window, document);



我是否应该始终传递正在使用的库,而不是直接使用它们?
我应该在此窗口中引用全局范围吗?

仅当最小化或冲突的库变量名是一个问题时。

07-28 03:46
查看更多