2

以下是 JavaScript 中的常见做法:

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

我了解包装器功能(它可以防止污染全局命名空间),但是许多库(如 jQuery、Underscore 等)已经在全局范围内定义了短名称($_)供我使用。我想知道这种方法的优势是什么。只是为了重命名jQuery为更短的名字?阻止我覆盖$?以后更容易在另一个库中交换?我想这些对我来说似乎都没有说服力。

此外,我还看到了这个:

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

这里甚至没有重命名。我什至见过:

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

直接使用有什么问题window

所以这就是我要问的:

  • 这种做法有名字吗?
  • 这种做法有什么好处?
  • 我应该总是传递我正在使用的库而不是直接使用它们吗?
  • 我应该传入this还是window作为对全局范围的引用?
4

2 回答 2

0

这种做法有什么好处?

如果变量(' _'、' $'等)稍后被其他代码覆盖,您的代码将继续按预期工作。它将使用调用包装函数时传入的值。

我应该总是传递我正在使用的库而不是直接使用它们吗?

不,但如果您对上述内容有任何疑虑,这可能是一个好习惯。此外,如果您查找 AMD 加载器(例如 Require.js),您会发现这是一种熟悉的技术,因为它们会执行类似的操作来定义模块的需求。

我应该传入 this 或 window 作为对全局范围的引用吗?

this具有代码将在全局范围内运行的优点。例如,如果您的代码可能在 Node.js 服务器上运行,则没有window.

于 2012-07-25T02:15:28.273 回答
0

这种做法有名字吗?

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

这种做法有什么好处?

  • 正如您所指出的,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); 
    

我应该总是传递我正在使用的库而不是直接使用它们吗?
我应该传入 this 或 window 作为对全局范围的引用吗?

仅当需要考虑缩小或冲突的库变量名称时。

于 2012-07-25T02:37:35.770 回答