2012-11-04 3 views
5

javascript에서 C++의 스택 기반 또는 로컬 오브젝트에서 소멸자와 같은 구조를 찾고 있습니다.C++에서 stackbased 오브젝트와 비슷한 것입니다.

#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 및 release 래핑에 사용)와 같이 범위 끝에서 특별한 조치가 필요하지 않은 방식으로 강력해야합니다.

건배, 범위의 코드가 동기로 보장되어있는 경우, 나중에 소멸자를 호출하는 함수를 만들 수 있습니다

답변

1

을을 mg. 하지만, ++는 유연하지 않을 수 및 구문은 C에서처럼 단정하지 않을 수 있습니다 :

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

이 기록됩니다 다음과 같이

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(); 
}; 

당신은 그것을 사용할 수

created 
inc 
inc 
destructed 2 
+2

흠. 복잡하지만 작동합니다. "var enteringcope"는 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 인터프리터)의 구현이 사용자의 필요에 맞게 이루어 지도록 강요하지 않기 때문에 슬프게도 찾고있는 것을 찾을 수 없습니다.

가비지 컬렉터은 범위를 벗어나는 객체에 대한 참조가 더 이상 없지만 (실제로는 "가능성"이 더 많습니다.) 표준화 된 방법이 없습니다 (예 : 개발자).

C++에서 dtor과 비슷한 기능을 제공하기 위해 해킹이 있습니다 (예 : 객체 자체를 사용하는 함수에 객체 사용을 래핑하고 "사용"-callback 함수) 동작".