Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery插件可以是模块的本地插件吗?_Javascript_Jquery_Jquery Plugins_Module Pattern - Fatal编程技术网

Javascript jQuery插件可以是模块的本地插件吗?

Javascript jQuery插件可以是模块的本地插件吗?,javascript,jquery,jquery-plugins,module-pattern,Javascript,Jquery,Jquery Plugins,Module Pattern,我非常喜欢JavaScript模块模式来封装数据和逻辑。我还广泛使用jQuery。我的问题是: 如果我在一个模块中定义jQuery扩展/插件,它会像其他函数一样位于该模块的本地吗?(我怀疑答案是否定的…) 例如: var igPartListManager = (function () { // Define a jQuery plug-in I'd like to be local to igPartListManager (function ($) { $.

我非常喜欢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扩展/插件式功能封装在一个模块中?

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

(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引擎都会通过所有封装作用域冒泡,一直冒泡到
窗口
作用域。具有该变量的第一个作用域是正在使用的作用域。因为在您的情况下,窗口作用域包含您的
jQuery
变量,所以您可以将其称为“全局”

调用此
$(“一些无关的选择器).myExtension()时
引擎查找变量
$
。如果该变量指向
窗口.jQuery
,则实际上您使用的对象与以前相同。因此,是的,在这种情况下会成功。但前提是在尝试调用
$().myExtension();
之前执行
igPartListManager
函数

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

例如:

变量是作用域的局部变量,而不是模块,但在本例中,jQuery插件是一个函数,函数会创建一个新的作用域,因此是的!但是,$是全局变量,因此当在选择器中使用正确的引号时,插件会起作用。谢谢@Hless。我在这里重新考虑我的需求,因为我不确定我是否会充分使用jQuery扩展在我的模块中证明我自己的jQuery“深度副本”是正确的。非常感谢!是的,我认为在全局对象的
$.fn
中添加函数是目前最好的选择。jQuery类确实变得更重了,但我不认为拥有该类的完整副本对您的性能有任何好处。这实际上与加载jQuery源代码多次使用,每次使用不同的变量名。但是我想要的函数是模块的本地函数,因此将它们添加到全局$。fn是我不想要的。没有其他人想要这些函数。