Javascript Push方法只工作一次,除非之前使用了变量

Javascript Push方法只工作一次,除非之前使用了变量,javascript,jquery,closures,Javascript,Jquery,Closures,这可能是个奇怪的问题。无论如何,我正在开发一个jQuery插件,对于这个问题,这是一段有用的代码,请注意,它并不是全部;: Javascript: (function($){ $.fn.newPlugin = function(){ var ranges = [], selectableRange = this; function init(){ selectableRange.live('mousedown', function

这可能是个奇怪的问题。无论如何,我正在开发一个jQuery插件,对于这个问题,这是一段有用的代码,请注意,它并不是全部;:

Javascript:

(function($){
    $.fn.newPlugin = function(){
        var ranges = [], selectableRange = this;

        function init(){
            selectableRange.live('mousedown', function(){
                selectableRange.live('mouseup', function(){
                    addRange(Math.random(), Math.random());
                    selectableRange.die('mouseup');
                });
            });
        }

        function addRange(a, b){
            // console.log(ranges);
            ranges.push({start: Math.min(a,b), end: Math.max(a,b)});
            console.log(ranges);
        }

        return { init: init };
    };
})(jQuery);

$(document).ready(function(){
    var instance = $('#element').newPlugin();
    instance.init();
});
HTML:

它所做的似乎毫无用处;不管怎样,每次有人把鼠标放在一个元素上,一个新的对象就会被添加到范围的后面。不幸的是,在我的控制台中,ranges数组只包含一个对象,不管在$'element'上单击多少次

我试图弄清楚发生了什么,并取消了console.logranges行的注释;在将对象推到范围数组的后面之前。然后,令人惊讶的是,它成功了。范围数组增长了


有人能告诉我为什么这个。推送只有在以前使用范围时才起作用吗?

我很难理解你在这里想做什么。这个返回值应该是什么意思

我能想到的唯一一件事是,你真正想做的是在定义插件时运行一个函数,这样函数本身就会返回实现插件的实际函数。事实上,在我看来,数组中只有一个元素的原因似乎是每次调用插件时都会创建一个新数组。看起来您正在尝试创建一个闭包,但是没有函数调用,因此没有进行闭包

尝试更改插件定义:

$.fn.newPlugin = (function() {
   // ...
   // all the code you currently have, though I still don't know
   // exactly what that return value is supposed to mean
   // ...
})();

很抱歉我问了这个问题


不知何故,Chrome的控制台缓存了它的日志,并在日志的左侧显示了越来越多的日志。一切正常…

我只是添加了更多代码,以便您可以自己测试它-我不使用$.fn.newPlugin,因为在jQuery插件中以这种方式使用$是不安全的。请参阅[插件代码中的自定义别名],更新后的代码实际上没有多大意义。在另一个活动处理程序中设置这样的活动处理程序似乎很奇怪,而且可能没有必要。
$.fn.newPlugin = (function() {
   // ...
   // all the code you currently have, though I still don't know
   // exactly what that return value is supposed to mean
   // ...
})();