Javascript 对象生命周期

Ahm*_*avi 5 javascript multithreading object

我有一个如下所示的 Javascript 类:

var MYCLASS = function(elem, data, op) {

    var options = {};

    var loopForEver = function() {
        console.log('I cant stop me');
        setTimeout(function() {
            loopForEver();
        }, 1000);
    }
    this.init = function() {
        loopForEver();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我实例化类并调用 init 函数时,循环开始,我每 1 秒在控制台中获取一次文本:

var ins = new MYCLASS();
ins.init();
Run Code Online (Sandbox Code Playgroud)

为什么当我将实例设置为空时,线程并没有停止?或者任何时候我创建一个新实例并将其分配给以前的实例名称,它都会增加调用。

在我的生产代码中,我没有无限循环,但我确实有一些业务逻辑。创建新实例时是否需要担心性能?

XAM*_*cky 4

当您调用 setTimeout 时,它不受调用它的函数的约束。您需要向对象添加一个名为 之类的属性timeOutID。只要该函数仍然需要被 setTimeout 之类的东西使用,它就会保留在范围内。

var MYCLASS = function(elem, data, op) {

    var options = {};
    var timeOutID = null;

    var loopForEver = function() {
        console.log('I cant stop me');
        timeOutID = setTimeout(function() {
            loopForEver();
        }, 1000);
    }
    this.init = function() {
        loopForEver();
    }
    this.stop = function () {
      clearTimeout(timeOutID);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为它确实存在。只要该函数仍然需要被“setTimeout”之类的东西使用,它就会保留在范围内。TL;DR 垃圾收集语言。 (3认同)