jQuery ajax成功回调到未引用对象会发生什么

时间:2012-01-19 05:09:06

标签: javascript jquery

我对JavaScript的理解是任何未引用的对象最终都会被垃圾收集。

var myVariable = null;

function mouseClick(){
       myVariable = new myObject();
}

因此,例如在每次运行mouseClick()函数时的上述代码中,myVariable将引用myObject()的新实例。使用myObject()实例以前仍然存在的myVariable引用(目前),但由于它不再被引用,它将被垃圾回收删除。是这样的吗?

我的问题是当未引用的myObject()有一个等待从服务器返回的杰出的jQuery ajax调用时会发生什么。例如。我创建了一个myObject()的实例,该实例由myVariable引用,并且作为该对象的创建的一部分,已经创建了jQuery Ajax请求,并且在服务器响应并且jQuery成功回调已经运行之前,mouseClick()功能再次运行。

我的理解是,现在有2个myObject()对象实例(一个被引用,一个没有),还有两个未完成的Ajax调用。我关注的是,来自现在未引用对象的Ajax调用的成功回调可以在新引用的myObject()上运行。我希望来自未引用的myObject()的Ajax调用将由未引用的myObject()运行,然后作为垃圾收集的一部分被删除。是这样吗。

1 个答案:

答案 0 :(得分:0)

您的示例不是未引用的变量。假设myVariable是一个全局变量,那么引用该变量中的myObject引用,因此不会对其进行垃圾回收。

对于ajax调用中涉及的对象,只要ajax调用正在进行中,即使您自己的代码没有引用它,对象IS也会被ajax子系统引用。只有当ajax调用完成时,内部引用才会被清除,因此可以进行垃圾回收。

也可以从函数闭包中发生引用,这些函数闭包通常在存在挂起的回调函数时发生。有关此代码中的例子:

function runTimer() {
    var x = new myObject();
    setTimeout(function() {
        x.foo();
    }, 1000);
}

即使runTimer()函数立即完成,给setTimeout的回调也会创建一个函数闭包,它会使该函数中的所有内容保持活动状态,直到setTimeout触发为止。因此,即使你没有在函数外部保持对函数中事物的显式引用并且函数已经完成执行,setTimeout也会因为函数关闭而使这些变量保持活动状态,直到setTimeout触发为止。

ajax调用也可能有类似的事情。