Javascript关闭和内存泄漏风险

时间:2013-01-28 08:58:00

标签: javascript jquery memory closures memory-leaks

我正在寻找我的javascript代码中的内存泄漏。 Ater发现了一些重大泄漏,我开始寻找轻微的东西,发现可能是潜在泄漏的东西 - “hoverIntent.js”插件。我想问一下这是不是真的是泄密还是我有点过于热心?

代码的一般架构(此处为完整代码http://cherne.net/brian/resources/jquery.hoverIntent.js):

(function($) {
    $.fn.hoverIntent = function(f,g) {

    //...


    var track = function(ev) {
        cX = ev.pageX;
        cY = ev.pageY;
    };

    var compare = function(ev,ob) {
        //... function body
    };


    var delay = function(ev,ob) {
       //... function body
    };


    var handleHover = function(e) {
      //... function body
    };


    return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
    };
})(jQuery);

我知道很多js插件都是这样编写的,但是......如果每次在我的对象上调用hoverIntent时都能正确地编写,那么会创建3个新的功能(闭包)吗?是不是可能的内存泄漏(或者至少是性能问题)?

这样写是不是更好:

(function($) {

  //create the methods only once on module init?

    var track = function(ev) {
        cX = ev.pageX;
        cY = ev.pageY;
    };

    var compare = function(ev,ob) {
        //... function body
    };


    var delay = function(ev,ob) {
       //... function body
    };


    var handleHover = function(e) {
      //... function body
    };


    $.fn.hoverIntent = function(f,g) {
            //no closures here
    return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);

    };
})(jQuery);

1 个答案:

答案 0 :(得分:2)

你是对的,你的第二个例子会因为封闭函数较少而使用较少的内存。但是只要你的事件不可调用(元素被移除等),它们就会再次消失,因此它不会“泄漏”,因为内存不会永远丢失。

此外,许多插件通过在变量中设置元素的当前状态而不是元素本身来使用闭包。