我甚至不确定如何说出这个问题,所以我必须先举例说明。这可能看起来不像是有用的代码,事实上它不是,但它是我刚刚遇到的问题的一个例子,被剥夺了基本要素。
允许'假设我有
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会发生什么?它是否有机会完成其工作(如果有的话,它是否会被垃圾收集)?或者在它有机会完成它的开始之前,它是否被毫不客气地倾倒?
答案 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),它们仍可访问。否则,它们无法访问,并且会在某些时候被回收。