Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:当我创建一个新实例时,旧对象会发生什么变化?_Javascript_Function_Object - Fatal编程技术网

Javascript:当我创建一个新实例时,旧对象会发生什么变化?

Javascript:当我创建一个新实例时,旧对象会发生什么变化?,javascript,function,object,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 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会发生什么情况?它有机会完成它的工作吗(如果有机会,它会被垃圾收集吗)?还是在它有机会完成它开始的工作之前就被随意转储了?

在这个特定实例中,您将创建两个
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.

请参阅以下工作示例:

所有耗时的异步工作都将异步进行:)

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

while(true) {
    // Check XHR status
}

不要担心垃圾收集;如果有一个像AJAX(XHR)请求这样的DOM事件,并且myObject在作用域中,那么在事件处理程序本身被垃圾收集之前,它不会被垃圾收集。

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


JavaScript中的对象很简单:只要任何代码(包括回调)都可以访问对象(例如,分配给作用域中的变量、窗口属性或绑定到DOM),它们就可以访问。否则,它们将无法访问,并将在某个时候被回收。

myObject
的两个调用都将完成(即,异步行为确实会发生两次)。我认为您在这个示例中没有包含足够的信息来确定是否会丢失任何信息,但这是很有可能的。每次调用
myFunction
都会创建自己的
doTheSlowStuff
变量,因此以后的调用不会从另一个调用中破坏
doTheSlowStuff
。但是,如果该值离开了
myFunction
的范围,则所有赌注都将被取消,并且确实可能发生碰撞。您可以从
myObject
返回承诺,并在
myFunction
中处理成功。需要添加的一件事是:DOM还可以引用对象并防止它们被垃圾收集。这里有一个关于如何发现这些漏洞的精彩演讲:@BrianGordon很好。我认为这只是从代码中访问的,但是请注意。“直到应用程序退出”这才是有趣的。你让我对我的问题有了更多的了解。我想要myObject做的是迭代一个参数数组,调用AJAX函数或其他函数,这些函数对数组中的每个变量都返回一个承诺。我不关心myFunction或myObject的返回值。我想避免的是,你似乎暗示会发生的事情——我创建的每一个对象都会留在记忆中,即使所有的Aysn同步的东西都完成了。是这样吗?如果是这样的话,我将不得不找到其他方法。@MarkGreenwood底线是,如果您没有对数据的任何引用,它最终将被垃圾收集。因此,没有什么特别的原因可以解释为什么不能在内存不足的应用程序中使用JavaScript。对于这个用例,它可能不是最合适的工具,您可能必须小心确保没有任何泄漏,但您可以使用JavaScript。只需确保从DOM中的任何位置都无法访问范围内数据的闭包,包括连接到DOM元素的事件处理程序或全局范围内的任何内容。看我上面链接的视频。@Brian Gordon谢谢,我想这就是我需要知道的。这不是一个内存不足的应用程序(现在),这个问题是关于我试图阻止它变得如此-我没有说得那么好。