JavaScript对象的寿命是什么?它们何时被销毁?

JavaScript对象的寿命是什么?它们何时被销毁?,javascript,ajax,yui,Javascript,Ajax,Yui,我对Javascript非常陌生,我刚刚读了下面的文章 您可以定义一个ajax连接 一次,并多次重复使用,以及 以后再开始和停止。这是一个 例如: 稍后,如果我想这样做的话 又是同一个ajax调用,我所要做的就是 电话: 如果我有一个非常常用的拍卖页面,并且我想使用myAjaxRequest连接来执行用户从其浏览器执行的所有操作,该怎么办。myAjaxRequest实例的生存期规则是什么?我想它在页面刷新时被破坏了。但还有什么东西破坏了它吗?假设该对象是在YUI沙盒中创建的,但这并不重要。很遗憾

我对Javascript非常陌生,我刚刚读了下面的文章

您可以定义一个ajax连接 一次,并多次重复使用,以及 以后再开始和停止。这是一个 例如:

稍后,如果我想这样做的话 又是同一个ajax调用,我所要做的就是 电话:


如果我有一个非常常用的拍卖页面,并且我想使用myAjaxRequest连接来执行用户从其浏览器执行的所有操作,该怎么办。myAjaxRequest实例的生存期规则是什么?我想它在页面刷新时被破坏了。但还有什么东西破坏了它吗?假设该对象是在YUI沙盒中创建的,但这并不重要。

很遗憾,在评论中回答了这个问题,因为没有人得到闭包(对不起,糟糕的双关语)@西姆·维达斯和@WaiLam值得称赞,但我至少会尝试想出一个答案:

当您有对对象的引用时(尽管变量
myAjaxRequest
),它将保留在内存中,直到卸载文档。如果将null赋值给变量(
myAjaxRequest=null
)、没有对该对象的其他引用,则垃圾收集器将回收用于存储该对象的内存

即使
myAjaxRequest
是函数中的局部变量,也可以存在引用。该函数可以返回对局部变量的引用,例如作为对象属性,例如:

function sandbox () {
    var myAjaxRequest = A.io.request(/* constructor... */);

    return {
        myRequest: myAjaxRequest
    };
}

var mySandbox = sandbox();
mySandbox.myRequest.start();
也可以通过闭包()返回引用,例如:


只要对对象有引用,它就不会被垃圾收集。在卸载页面之前,您可以安全地调用
start
方法。

否。如果不手动更改
myAjaxRequest
对象,它将在文档的生命周期内可用。(假设变量是全局变量)设置myAjaxRequest=null。它应该根据浏览器来执行gc。那么时间呢,浏览器内存管理还是其他什么呢。我认为在本例中,变量在YUI沙盒回调函数的范围内。它加载此变量的模块实例。但是假设它是一个全局变量。您可以阅读此链接以获取有关javascript中gc的更多信息。那么,为什么这些答案中的任何一个都不是真实的答案,而仅仅是评论呢P
myAjaxRequest.start();
function sandbox () {
    var myAjaxRequest = A.io.request(/* constructor... */);

    return {
        myRequest: myAjaxRequest
    };
}

var mySandbox = sandbox();
mySandbox.myRequest.start();
function sandbox () {
    var myAjaxRequest = A.io.request(/* constructor... */);

    return {
        getRequest: function () {
            return myAjaxRequest;
        } 
    };
}

var mySandbox = sandbox();
mySandbox.getRequest().start();