0

我正在阅读 jQuery 插件,在官方指南中作者指出:

“但是等等!我知道和喜爱的很棒的美元符号在哪里?它仍然存在,但是为了确保您的插件不会与可能使用美元符号的其他库发生冲突,最好将 jQuery 传递给 IIFE (立即调用函数表达式)将其映射到美元符号,因此在其执行范围内它不能被另一个库覆盖。”

这是示例代码:

(function( $ ) {
    $.fn.myPlugin = function() {

        // Do your awesome plugin stuff here

    };
})( jQuery );

我的问题是,为什么 IIFE 是必要的,没有它可能会发生碰撞的一些例子是什么?执行时,$ 参数将被 Jquery 全局变量替换,因此 IIFE 正在更改全局变量。对我来说,这似乎表明碰撞的可能性和以前一样。我知道我在这里遗漏了一些东西。非常感谢您的帮助!

4

2 回答 2

1

该符号被原型MooTools$等其他库用作全局变量。因此全局变量可能不引用 jQuery;这就是jQuery 的 noConflict 方法存在的原因。$

因此,如果您的插件要在除了 jQuery 之外还使用原型或 MooTools 的页面上使用,您不能确定它$是否会引用 jQuery,但您可以假设该jQuery变量会。如果您正在编写一个插件,您希望使其尽可能易于其他人使用。因此,您希望使其与其他库无缝使用。

IIFE 使获得这种安全性成为可能,并且仍然可以方便地$在您的代码中使用。如果您可以始终使用jQuery引用而不是引用jQuery 库,$那么 IIFE 是不必要的。

于 2012-06-23T18:11:54.830 回答
0

想象一下,某个其他库“窃取”了$全局变量(通过为其分配自己的库对象):

$ = otherLibrary;

现在,$指的是另一个库,但jQuery(它也是一个全局变量)仍然指的是 jQuery 库。

如果你的插件是这样写的:

$.fn.myPlugin = function () { ... };

它不会被分配给 jQuery 的$.fn对象,因为$不再引用 jQuery 库。

但是,如果你的插件是这样写的:

(function ( $ ) {
    $.fn.myPlugin = function () { ... };
}( jQuery ));

它将被分配给 jQuery 的$.fn对象,因为 (local) 参数$是对全局变量的引用jQuery

所以:

$ === jQuery // false

(function ( $ ) {

    $ === jQuery // true

    $.fn.myPlugin = function () { ... };

}( jQuery ));

$ === jQuery // false

该参数$正在遮蔽全局变量$(引用另一个库)。

于 2012-06-23T18:14:07.383 回答