что-то вроде стековых объектов в C ++ для JavaScript

Ищем конструкцию в 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 и release).

Ура, мг

5

Решение

Если код в области гарантированно будет синхронным, вы можете создать функцию, которая впоследствии будет вызывать деструктор. Это может быть не так гибко, и синтаксис может быть не таким аккуратным, как в 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
1

Другие решения

К сожалению, вы не сможете найти то, что ищете, так как языковой дизайн не заставляет реализацию механизма ECMAScript (то есть интерпретатора javascipt) выполнять то, что вам нужно.

уборщик мусора будет (на самом деле, это скорее «мощь»), когда больше не будет ссылок на объект, выходящий из области видимости, но нет никакого стандартизированного способа, которым вы (как разработчик) могли бы воспользоваться этим.

Существуют хаки (например, использование использования вашего объекта в функции, принимающей сам объект, и функция «использования» -callback) для обеспечения функциональности, аналогичной dtorнаходится в C ++, но не без каких-либо «дополнительных действий».

1

По вопросам рекламы [email protected]