3

Recetly 我一直在寻找我的 javascript 代码中的内存泄漏。在发现一些重大泄漏之后,我开始寻找较小的泄漏,并发现了一些可能是潜在泄漏的东西——“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);
4

1 回答 1

2

你是对的,你的第二个例子会使用更少的内存,因为闭包函数更少。但是,一旦您的事件不可调用(删除了元素等),它们就会再次消失,因此它不是“泄漏”,因为内存不会永远丢失。

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

于 2013-01-28T09:06:05.150 回答