【问题标题】:Can a jQuery plug-in be local to a module?jQuery 插件可以是模块的本地插件吗?
【发布时间】:2013-12-31 12:52:21
【问题描述】:

我真的很喜欢 JavaScript 模块模式来封装数据和逻辑。我也在广泛使用 jQuery。我的问题是这样的:

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

例子:

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 之外,这会成功吗?

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

如果是这样,我如何最好地将“本地”jQuery 扩展/类似插件的功能封装在一个模块中?

【问题讨论】:

  • 变量是作用域的局部变量,而不是模块,但在这种情况下,jQuery 插件是一个函数,一个函数会创建一个新的作用域,所以是的!但是,$ 是一个全局变量,所以当在选择器中使用正确的引号时,插件可以工作。

标签: javascript jquery jquery-plugins module-pattern


【解决方案1】:

为了更好地解释这一点,我举了一个小例子来说明你定义扩展时实际发生的情况:

(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 deep copying object

【讨论】:

  • 谢谢@Hless。我在这里重新考虑我的要求,因为我不确定我是否会在我的模块中充分使用 jQuery 扩展来证明我自己的 jQuery 的“深拷贝”。非常感谢!
  • 是的,我认为向全局对象的$.fn 添加函数是目前最好的选择。 jQuery 类确实变得更重,但我不认为拥有该类的完整副本对性能有任何好处。这实际上与多次加载 jQuery 源代码相同,每次使用不同的变量名。
  • 然而我想要的功能在我的模块中是本地的,所以将它们添加到全局 $.fn 是我不想要的泄漏。没有其他人会想要这些功能。
猜你喜欢
  • 2020-08-24
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多