Javascript:创建新实例时旧对象会发生什么?

时间:2014-01-27 22:41:27

标签: javascript function object

我甚至不确定如何说出这个问题,所以我必须先举例说明。这可能看起来不像是有用的代码,事实上它不是,但它是我刚刚遇到的问题的一个例子,被剥夺了基本要素。

允许'假设我有

function myObject(params) {

    .. do some time-consuming asynchronous stuff 
       with AJAX and the like ...

    return (before all the above is completed);

}

function myFunction(params) {

    var doTheSlowStuff = new myObject(params);

}

myFunction(firstParams);
myFunction(moreParams);

当我第二次调用myFunction()时,第一个myObject会发生什么?它是否有机会完成其工作(如果有的话,它是否会被垃圾收集)?或者在它有机会完成它的开始之前,它是否被毫不客气地倾倒?

3 个答案:

答案 0 :(得分:1)

所有耗时的异步事件都会异步发生:)

这意味着异步调用(例如XHR或setTimeout)立即返回并允许继续执行。换句话说,myObject构造函数将很快返回,因此在构造两个myObject之间不会有任何延迟。在两个 myFunctions返回后,最后控件将返回到事件循环,JavaScript引擎将继续处理事件,如鼠标点击,WebSocket事件,定时器如setTimeout或XHR请求返回。在将控制权返回给事件循环之前,不会执行异步回调,所以不要像

那样做任何疯狂的事情
while(true) {
    // Check XHR status
}

不要担心垃圾收集;如果你的myObject在范围内有一个类似AJAX(XHR)请求的DOM事件,那么在事件处理程序本身被垃圾收集之前它不会被垃圾收集。

答案 1 :(得分:0)

在此特定实例中,您将创建两个myObject实例,这些实例将保留在内存中,直到您的应用程序退出。

您可以通过异步运行来测试此行为来证明这一点:

function myObject(params) {

  // do something async, like output
  // every second ...
  var callback = function () {
    console.log("I am object " + params);
    setTimeout(callback, 1000);
  };
  callback (); 

}

function myFunction(params) {

    var doTheSlowStuff = new myObject(params);

}

myFunction(1);
myFunction(2);
// etc.

请参阅以下工作示例:http://jsbin.com/osEFuWib/1/edit

答案 2 :(得分:0)

异步代码可以访问回调函数。回调将运行并且是任何其他对象的独立。 “丢失”对象或创建新对象不会改变这一点。因此,必须明确取消挂起的异步操作,或者必须防止回调在执行调用时执行不需要的操作。

关于JavaScript中对象的事情很简单:只要任何代码 - 包括回调 - 都可以访问对象(例如,分配给范围内的变量,窗口​​属性或绑定到DOM),它们仍可访问。否则,它们无法访问,并且会在某些时候被回收。