【问题标题】:something like stackbased objects in c++ for javascript类似于 c++ 中用于 javascript 的基于堆栈的对象
【发布时间】:2012-10-24 11:13:43
【问题描述】:

在 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 和释放)一样。

干杯,毫克

【问题讨论】:

    标签: javascript c++ scope destructor stack-based


    【解决方案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
    

    【讨论】:

    • 嗯。复杂,但有效。由于“var enterscope”特定于 M,因此可以将其更改为: M.scoped = function(func) { var m=new M;函数(米); m.destruct(); };然后它的用法是: M.scoped(function(m) { m.inc(); m.inc(); });
    • 对不起,应该写成:var enterscope-definition could be made specific to M...
    • item.destruct() 应该包含在 finally 块中:try { func(item); } finally { item.destruct(); }
    【解决方案2】:

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

    garbage-collector 将(实际上它更像是一种“可能”)在没有更多对超出范围的对象的引用时启动,但没有任何标准化的方法您(作为开发者)可以利用这一点。

    有一些技巧(例如将对象的使用包装在一个函数中,该函数采用对象本身和一个“使用”回调函数)以提供类似于 C++ 中dtor 的功能,但并非没有任何“额外行动”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2012-02-07
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多