Javascript jQuery插件实例变量

Javascript jQuery插件实例变量,javascript,jquery,Javascript,Jquery,我从jQuery插件开始,为这个新手问题道歉。我的目标是将一个插件实例化两次,其中每个实例都有自己的变量值。但是,它们似乎共享名称空间 例如,给定以下插件: (function ( $ ) { var x = false; $.fn.test = function() { alert(x); if ( !x ) x = true; return this; }; }( jQuery ));

我从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
的状态是否改变。我同意你的看法,这个条件是没有必要的。