Javascript jQuery插件实例变量
我从jQuery插件开始,为这个新手问题道歉。我的目标是将一个插件实例化两次,其中每个实例都有自己的变量值。但是,它们似乎共享名称空间 例如,给定以下插件:Javascript jQuery插件实例变量,javascript,jquery,Javascript,Jquery,我从jQuery插件开始,为这个新手问题道歉。我的目标是将一个插件实例化两次,其中每个实例都有自己的变量值。但是,它们似乎共享名称空间 例如,给定以下插件: (function ( $ ) { var x = false; $.fn.test = function() { alert(x); if ( !x ) x = true; return this; }; }( jQuery ));
(function ( $ ) {
var x = false;
$.fn.test = function() {
alert(x);
if ( !x )
x = true;
return this;
};
}( jQuery ));
从以下div调用的:
$( "div1" ).test();
$( "div2" ).test();
当目标是必须设置变量集时,警报将先显示false,然后显示true,其中警报将显示false两次
这可能吗?您应该
var x = false;
在$.fn.test函数中
,否则x
变量对于所有test()
函数都是相同的,并且在第一次调用后设置为true
您可以阅读有关javascript变量作用域的更多信息。您的问题有些混乱。你的插件是一个简单的函数。不能通过调用函数来“实例化”函数。所以你也不会“实例化”你的插件 您可以在函数中实例化一些东西,并将它们保存到某个地方 由于外部作用域只运行一次,因此在原始解决方案中,您只获得变量
x
的一个实例
如果在函数内部创建它,则每次调用它时都会创建一个新实例
我假设您希望为调用此插件的每个元素创建一个实例。一个好的解决方案是将数据附加到启动插件的DOM元素上,如:
(function ( $ ) {
$.fn.test = function() {
var vars = this.data('testPlugin');
if (!vars) {
vars = {
x: false,
something: 'else'
};
this.data('testPlugin', vars);
}
alert(vars.x);
vars.x = !vars.x;
return this;
};
}( jQuery ));
试试。事实上,这比前面的答案容易得多。插件中的
这个
的上下文是基于您提供的选择器接收的DOM元素的jQuery对象。要获得唯一性,只需迭代每个元素,如下所示:
(function($) {
$.fn.test = function() {
return this.each(function() {
var x = false;
alert(x);
if (!x) {
x = true;
}
});
}
}(jQuery));
$("div1").test(); //false
$("div2").test(); // false
这里有一个JSFiddle要确认:可能是重复的感谢,但它不起作用。我把
var x=false
inside$.fn.test function
显然变量总是设置为false,不仅仅是在第一次调用之后。谢谢,我说“实例化”,因为我看到插件是一个带有属性和函数的对象。alert(x)
在这里总是警告false,由于没有其他东西可以访问内部范围,if…
部分完全没有必要,因为没有其他东西可以访问x
。这是有意的吗<代码>返回这个.each(函数(){alert(false);})也会这样做。根据我对发布的原始问题的解释,条件检查是任意的,用于评估x
的状态是否改变。我同意你的看法,这个条件是没有必要的。