Javascript相当于对象模型中的destruct

php*_*_qq 40 javascript destructor

由于我用javascript的时髦"对象模型"处理过去,我认为没有析构函数这样的东西.我的搜索有点不成功,所以你们是我最后的希望.如何在实例销毁时执行内容?

Tho*_*unk 28

MDN是JS的一个很好的资源.不,当对象停止时,没有什么比调用函数更好的了.

  • @ThomasJunk,Re"*因为JS是垃圾收集所以*"垃圾.**Java也是垃圾收集,它提供了析构函数.** (44认同)
  • 并非所有环境都有一个`window`变量,并非每个变量都是全局的(理想情况下都不是!),并且可能有许多其他对该对象的引用.所以"技巧"基本上没用. (12认同)
  • @ThomasJunk Swift也被垃圾收集,它提供了析构函数.C/C++都没有显式地调用```析构函数```,也没有快速调用.当对象超出范围时,C++调用析构函数.``detructor```不是解除分配器,它只是做一些清理工作并将其留给语言运行时.Swift维护引用计数.大多数垃圾收集也在范围上触发.垃圾收集不是原因.这只是设计问题. (3认同)
  • @AntiMoron轻微澄清,Swift不是垃圾收集(至少不是传统意义上的).ARC没有在后台运行的进程,当存在内存压力时会收集对象,或者在使用Java,JavaScript和其他基于GC的语言时定期运行.相反,当对象引用等于零时,ARC启用Swift/Objective-C,对象在现场被销毁(也就是编译器为您插入保留/释放). (3认同)
  • 快速回答:不.不是.有一个技巧:o = {kill:function(){window.o = null;}} (2认同)
  • @zeroflagL这只是意味着»com grano salis«;) (2认同)
  • 但是当一个对象达到零引用时,进行回调是不是很容易实现和有用? (2认同)
  • @Pacerier,我假设你指的是Java的“finalize”方法。它与 C++ 析构函数类似,因为它在释放对象的内存之前调用。但是,与 C++ 不同,没有硬性保证会调用“finalize”。例如,如果程序在对象达到零引用计数后在下一个 GC 周期之前退出,则永远不会调用“finalize”。另外,如果引用计数永远不会为零,但我想您可能会期望在这种情况下不会调用它。:) (2认同)

小智 6

FinalizationRegistry可能正是您所需要的。它不是析构函数,但一旦对象被垃圾回收,它就会执行一个函数。无论如何,这就是我第一次来到这里时希望找到的东西:)