Javascript jQuery插件可以是模块的本地插件吗?
我非常喜欢JavaScript模块模式来封装数据和逻辑。我还广泛使用jQuery。我的问题是: 如果我在一个模块中定义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 ($) { $.
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是我不想要的。没有其他人想要这些函数。