Javascript jQuery内存泄漏的可能性有多大?

Javascript jQuery内存泄漏的可能性有多大?,javascript,jquery,browser,Javascript,Jquery,Browser,想象一下,我使用jQuery/AJAX构建了一个复杂的界面,并希望具有该界面的应用程序整天都处于打开状态。它大量处理AJAX、构建其元素、删除其他元素、更改位置和大小等。内存泄漏或浏览器滞后的可能性有多大?如何更好地处理数据和代码以避免过度使用内存?浏览器方面有什么问题我可以面对吗?你可以通过不创建超过完成任务所需的对象来解决内存过度使用的问题 但是,除非浏览器中有but,否则jQuery不应出现内存泄漏。您可以通过不创建超过完成任务所需的对象来解决内存过度使用的问题 但是,除非浏览器中有but

想象一下,我使用jQuery/AJAX构建了一个复杂的界面,并希望具有该界面的应用程序整天都处于打开状态。它大量处理AJAX、构建其元素、删除其他元素、更改位置和大小等。内存泄漏或浏览器滞后的可能性有多大?如何更好地处理数据和代码以避免过度使用内存?浏览器方面有什么问题我可以面对吗?

你可以通过不创建超过完成任务所需的对象来解决内存过度使用的问题


但是,除非浏览器中有but,否则jQuery不应出现内存泄漏。

您可以通过不创建超过完成任务所需的对象来解决内存过度使用的问题


但是,除非浏览器中有but,否则jQuery不应出现内存泄漏。

这将取决于浏览器。我知道jQuery没有引入任何内存泄漏,但我知道在某些浏览器中闭包会导致内存泄漏。我的意思是,您应该担心内存泄漏,但可能不是来自jQuery

防止内存泄漏可能非常困难,尤其是当应用程序在可变环境中运行时。在不同的浏览器上长时间运行应用程序,并跟踪每个浏览器的内存使用情况——通过这种方式,您可以确定有多少内存泄漏,如果您有问题,您可以尝试修复它

一般来说,您应该像对待优化一样对待泄漏。也就是说:让它工作,然后让它快速=>让它工作,然后让它变轻


希望这有帮助:)

这将取决于浏览器。我知道jQuery没有引入任何内存泄漏,但我知道在某些浏览器中闭包会导致内存泄漏。我的意思是,您应该担心内存泄漏,但可能不是来自jQuery

防止内存泄漏可能非常困难,尤其是当应用程序在可变环境中运行时。在不同的浏览器上长时间运行应用程序,并跟踪每个浏览器的内存使用情况——通过这种方式,您可以确定有多少内存泄漏,如果您有问题,您可以尝试修复它

一般来说,您应该像对待优化一样对待泄漏。也就是说:让它工作,然后让它快速=>让它工作,然后让它变轻


希望这有帮助:)

jQuery本身在清理绑定在事件中的项目等方面做得相当好。但是,通过销毁jQuery之外的对象,仍然很容易泄漏事件等。例如:

$('#someDiv a').bind('click', function(){ ... });
$('#someDiv').html('foo');
上面的代码清除了div中的链接,但是由于jQuery不知道它,因此它没有从事件的内部数据存储中释放函数,函数泄漏

您还可以使用任何现有泄漏模式轻松泄漏,其中有许多:循环引用等。其中许多是由闭包引起的


google“javascript泄漏模式”获取信息。

jQuery本身在清理绑定在事件中的项目等方面做得相当好。但是,通过破坏jQuery之外的对象,仍然很容易泄漏事件等。例如:

$('#someDiv a').bind('click', function(){ ... });
$('#someDiv').html('foo');
上面的代码清除了div中的链接,但是由于jQuery不知道它,因此它没有从事件的内部数据存储中释放函数,函数泄漏

您还可以使用任何现有泄漏模式轻松泄漏,其中有许多:循环引用等。其中许多是由闭包引起的


谷歌“javascript泄漏模式”获取信息。

jQuery对内存泄漏非常小心,例如:
(我正在展示1.3.2中的代码片段,我希望以后的版本会同样小心)
当您使用
.html(“”)
将节点的innerHTML设置为
'
时,会发生以下情况

/**** jQuery's html method ****/
html: function( value ) {
    return value === undefined ?
        (this[0] ?
            this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
            null) :
        /**** This bit will call empty on the node ****/
        this.empty().append( value );
},

/**** jQuery's empty method ****/
empty: function() {
    /**** this bit removes all dom nodes that are children ****/
    // Remove element nodes and prevent memory leaks
    jQuery(this).children().remove();

    /**** this bit just gets rid of text nodes ****/
    // Remove any remaining nodes
    while ( this.firstChild )
        this.removeChild( this.firstChild );
}

/**** jQuery's remove method ****/
remove: function( selector ) {
    if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
        // Prevent memory leaks
        jQuery( "*", this ).add([this]).each(function(){

            /**** This is the important bit, all events and all data  ****/
            /**** including references to other objects and nodes are removed  ****/
            /**** Sweet! ****/
            jQuery.event.remove(this);
            jQuery.removeData(this);
        });
        if (this.parentNode)
            this.parentNode.removeChild( this );
        }
}, 

我很有信心jQuery在防止内存泄漏方面会做得很好。当然,如果您使用
innerHTML
删除内容,您将失去这一好处。这并不是说你不应该这样做,它更有效,但你要么不必担心可能的泄漏,要么确信子节点没有附加事件或数据。

jQuery对内存泄漏非常小心,例如:
(我正在展示1.3.2中的代码片段,我希望以后的版本会同样小心)
当您使用
.html(“”)
将节点的innerHTML设置为
'
时,会发生以下情况

/**** jQuery's html method ****/
html: function( value ) {
    return value === undefined ?
        (this[0] ?
            this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
            null) :
        /**** This bit will call empty on the node ****/
        this.empty().append( value );
},

/**** jQuery's empty method ****/
empty: function() {
    /**** this bit removes all dom nodes that are children ****/
    // Remove element nodes and prevent memory leaks
    jQuery(this).children().remove();

    /**** this bit just gets rid of text nodes ****/
    // Remove any remaining nodes
    while ( this.firstChild )
        this.removeChild( this.firstChild );
}

/**** jQuery's remove method ****/
remove: function( selector ) {
    if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
        // Prevent memory leaks
        jQuery( "*", this ).add([this]).each(function(){

            /**** This is the important bit, all events and all data  ****/
            /**** including references to other objects and nodes are removed  ****/
            /**** Sweet! ****/
            jQuery.event.remove(this);
            jQuery.removeData(this);
        });
        if (this.parentNode)
            this.parentNode.removeChild( this );
        }
}, 

我很有信心jQuery在防止内存泄漏方面会做得很好。当然,如果您使用
innerHTML
删除内容,您将失去这一好处。这并不是说你不应该这样做,它更有效,但你要么不必担心可能的泄漏,要么确信子节点没有附加事件或数据。

我认为你在这里担心得有点太多了。@BoltClock是的。谁整天打开相同的浏览器选项卡?:)我觉得你在这里担心得有点太多了。谁整天打开相同的浏览器选项卡?:)