【问题标题】:Javascript closures and memory leak risksJavascript 闭包和内存泄漏风险
【发布时间】:2013-01-11 14:01:05
【问题描述】:

我最近一直在寻找我的 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);

【问题讨论】:

标签: javascript jquery memory closures memory-leaks


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2021-08-02
    • 2017-11-25
    • 2013-03-29
    • 2013-07-12
    • 2016-01-12
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多