2012-11-04 3 views
5

javascriptの構造体を探しています。これは、C++のスタックベースまたはローカルオブジェクトのデストラクタのように機能します。C++のスタックベースのオブジェクトのようなものjavascript

これは、スコープが終了したとき(「スコープから外れる」とき)にアクションを実行する構造体を探していることを意味します。それは、C++のデストラクタ(mutex-allocとreleaseのラッピングに使用される)のように、スコープの終わりに特別なアクションを必要としないように堅牢でなければなりません。

乾杯、範囲内のコードは、同期であることが保証されている場合は、その後のデストラクタを呼び出す関数を作成することができ

答えて

1

1mg当たり。それはのように柔軟ではないかもしれないと構文は、しかし、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 
+2

Hmm。複雑ですが、機能します。 "var beginscope"はMに固有なので、次に変更することができます: M.scoped = function(func){ var m = new M; func(m); ; m.destruct(); }; であり、その使用は次のようになります。 M.scoped(function(m){ m.inc(); m.inc(); }); – MGrant

+0

申し訳ありませんが、以下のように書かなければなりません:var enteredcope-definitionはMに特有のものにすることができます。 – MGrant

+1

'item.destruct()'は 'finally'ブロックにラップする必要があります: ' try {func(item); } finally {item.destruct(); } ' – user

1

悲しいことに、あなたはあなたが探しているものを見つけることができません。なぜなら、言語設計は、ECMAScriptエンジン(つまりjavasciptインタプリタ)の実装があなたの必要とすることを強制しないからです。

ガベージコレクタは、スコープから外れているオブジェクトへの参照がなくなったときに(実際は「可能性があります」)、あなたの標準化された方法はありません開発者)がこれを利用できるようにします。

ハックがあります(例えば、オブジェクト自体の機能を使用してオブジェクトの使用をラップし、 "usage" -callback関数)、dtorのような機能をC++で提供しますが、アクション"。

関連する問題