5

在 javascript 中寻找一个结构,其工作方式类似于基于堆栈的析构函数或 c++ 中的本地对象,例如

#include <stdio.h>
class M {
public:
  int cnt;
  M()        {cnt=0;}
  void inc() {cnt++;}
  ~M()       {printf ("Count is %d\n", cnt);}
};
...
{M m;
 ...
 m.inc ();
 ...
 m.inc ();
} // here the destructor of m will printf "Count is 2");

所以这意味着我正在寻找一个在其范围结束时(当它“超出范围”时)执行操作的构造。它应该是健壮的,因为它不需要在作用域结束时进行特殊操作,就像 c++ 中的析构函数(用于包装 mutex-alloc 和释放)一样。

干杯,毫克

4

2 回答 2

1

如果作用域内的代码保证是同步的,你可以创建一个函数,之后调用析构函数。但是,它可能不像 C++ 那样灵活,语法也可能不像 C++ 那样简洁:

var M = function() {
  console.log("created");
  this.c = 0;
};

M.prototype.inc = function() {
  console.log("inc");
  this.c++;
};

M.prototype.destruct = function() {
  console.log("destructed", this.c);
};


var enterScope = function(item, func) {
  func(item);
  item.destruct();
};

您可以按如下方式使用它:

enterScope(new M, function(m) {
  m.inc();
  m.inc();
});

这将被记录:

created
inc
inc
destructed 2
于 2012-11-04T11:48:11.373 回答
1

遗憾的是,您将无法找到您正在寻找的内容,因为语言设计不会强制 ECMAScript 引擎(即 javascipt 解释器)的实现来满足您的要求。

当没有更多对超出范围的对象的引用时,垃圾收集器将(实际上它更多是“可能”)启动,但是您(作为开发人员)没有任何标准化的方式可以利用这。

有一些技巧(例如将对象的使用包装在一个获取对象本身的函数和一个“使用”回调函数中)以提供类似于dtorC++ 中的 's 的功能,但并非不采取任何“额外操作”。

于 2012-11-04T11:48:35.757 回答