关于javascript:jQuery插件可以是模块的本地插件吗?

Can a jQuery plug-in be local to a module?

我非常喜欢JavaScript模块模式来封装数据和逻辑。我还广泛使用jquery。我的问题是:

如果我在一个模块中定义一个jquery扩展/插件,它会像其他函数那样是该模块的本地函数吗?(我怀疑答案是否定的…)

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var igPartListManager = (function () {
    // Define a jQuery plug-in I'd like to be local to igPartListManager
    (function ($) {
        $.fn.myExtension = function () {
            // Do something with this.each()...
        }
    })(jQuery);

    var doSomethingCore = function () {
        // Use my jQuery plug-in
        $("selector").myExtension();
    };

    return {
        doSomething
            : doSomethingCore
    };
})();

除了igpartlistmanager,这会成功吗?

1
2
...
$("some_unrelated_selector").myExtension();

如果是这样,我如何最好地将"本地"jquery扩展/插件式功能封装到模块中?


为了更好地解释这一点,我举了一个小例子,说明在定义扩展时实际会发生什么:

1
2
3
4
5
6
(function ($) {
    // $ = window.jQuery;
    $.fn.myExtension = function () {
        // Do something with this.each()...
    }
})(window.jQuery); // Note window.jQuery is basically the same as just jQuery from your example code

每当您试图访问一个变量时,javascript引擎就会通过所有封装范围一直冒泡到window范围。具有该变量的第一个作用域是正在使用的作用域。因为在您的案例中,窗口范围包含您的jQuery变量,所以您可以称之为"全局"。

当调用此$("some_unrelated_selector).myExtension();时,引擎查找变量$。如果这个变量指向window.jQuery,那么实际上您使用的对象与以前相同。所以是的,在这种情况下,这是成功的。但前提是在调用$().myExtension();之前执行了igPartListManager函数。

为扩展创建本地作用域的唯一方法是在向其添加扩展之前,将window.jQuery变量深度复制到本地变量。

例子:javascript深度复制对象