Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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 typeScript中有析构函数吗_Javascript_Typescript_Destructor - Fatal编程技术网

Javascript typeScript中有析构函数吗

Javascript typeScript中有析构函数吗,javascript,typescript,destructor,Javascript,Typescript,Destructor,TypeScript中有析构函数吗?如果没有,如何删除对象? 我尝试了析构函数()和~ClassName(),但没有成功。JavaScript使用垃圾收集在对象不再被引用时自动删除对象。没有析构函数或终结器的概念 您无法观察垃圾收集器何时删除对象,也无法预测该对象。您实际上可以 class MyClass { constructor(input1, input2){ this.in1 = input1; this.in2

TypeScript中有析构函数吗?如果没有,如何删除对象?
我尝试了
析构函数()
~ClassName()
,但没有成功。

JavaScript使用垃圾收集在对象不再被引用时自动删除对象。没有析构函数或终结器的概念

您无法观察垃圾收集器何时删除对象,也无法预测该对象。

您实际上可以

    class MyClass {
        constructor(input1, input2){
             this.in1 = input1;
             this.in2 = input2;
         }

    }
    let myObject = {};


    try {
         myObject = {
             classHandler: new MyClass('1','2')
         }
    } catch (e) {
    } finally {
        delete myObject.classHandler
    }

如果计时器、回调或事件侦听器仍然连接到要删除的对象,则可能会阻止垃圾收集。如果回调/侦听器仍然存在,但对象不存在,也可能会出现错误。如果你想绝对确定你可以编写你自己的析构函数方法,并在删除对象之前调用它。这不是一个正确的答案。Gábor Lupák最喜欢的人知道那里正在进行垃圾收集。即使使用垃圾收集器,您有时仍需要在应用程序执行期间的特定点释放一些长期存在的引用,以便引用资源可以进行垃圾收集,或者至少不存在内存泄漏。我的建议是创建一个接口(例如:interface Releasable{},并定义一个名为release()的方法,还可以定义一个名为release()的标志,用于防止运行release()不止一次。@asiby-这是一个合适的解决方法,但该解决方案不是析构函数。答案是正确的-Javascript没有析构函数。最后,析构函数不需要与GC的关系就可以工作。严格地说,析构函数是在对象的生命周期结束时调用的,而不是在收集对象时调用的(无论如何,它必须在调用析构函数之后)。因此,我们不需要将析构函数调用与GC的操作同步。实际上,析构函数可以在收集之前的任何时间点触发。如果语言的语义支持静态生存期,编译器可以合成
obj.destruct()
在对象的生存期即将到期之前(例如,当它离开程序作用域时)。您不正确。如果您正在侦听事件或被侦听事件,则允许垃圾收集的唯一方法是取消订阅事件侦听器。执行此操作的方法是调用析构函数方法,该方法有时会调用其他引用类实例的其他析构函数方法(如果适用),也出于停止的原因ping事件侦听器。另外,至少在NodeJ中,现在可以观察GC操作了。您能否详细说明这是如何工作的?我对
delete
操作符的理解是,它只是删除对对象的引用,垃圾收集仍然像往常一样不可预测地发生。“从2019年起,无法在JavaScript中显式或以编程方式触发垃圾收集。"-Mozilla。但是这个脚手架提供了一种可预测的方式,可以将对象视为垃圾。即使作为一种解决方法,也没有那么简单。假设该类设置了一个调用其方法的间隔计时器。这只是可以防止对象在垃圾收集过程中被破坏的众多方法之一。通常有很多关于
delete
的困惑,尤其是在JavaScript新手中,我担心这个答案会使这种困惑永久化。
delete
与垃圾收集无关。实际上,实现可预测的资源清理的方法似乎是添加一个方法(例如
destroy
)当应用程序不再需要该对象时调用它。@Thomastornier
该对象可以被视为垃圾
当然,当变量超出范围、被显式删除或最后一次引用不再指向该对象时,我们总是这样做。但问题不在于此,而在于该对象实际是垃圾-收集,而不是当它成为垃圾收集的候选者时。存在一个概念上的误解。析构函数的概念与垃圾收集仅存在切点关系,因为在某些语言中,GC可能是调用它的人,但事实并非如此,实例可以被处置或拥有它的析构函数在GC前一刻调用,但根本没有绑定到它。有些语言确实将“析构函数”的概念绑定到GC,但实际上IDisposable的实现者有两种析构函数,一种是可以确定使用的,另一种不是。但这只是一种特定的实现,而不是一般的概念。