简化示例..
Javascript对象构造函数
var Foo = function() {
someEventEmitter.on("event", this.someHandler);
throw new Error("Unexpected error happening in a constructor");
}
// ...
var myObject;
try {
myObject = new Foo();
} catch(e) {
}
某些现实案例的情况与上述示例类似。尝试构造对象,但构造函数(或可能是父构造函数)会抛出错误。可以编程操作抛出,或者像参考错误一样的bug。
在抛出异常之前,构造函数会在/上设置侦听器或其他数据。如何处理以避免内存泄漏和故障对象上发出的事件?清理垃圾,删除添加的侦听器等。
答案 0 :(得分:1)
你需要在构造函数中处理它,
理想情况下,做一切可以在之前抛出你可能需要清理的东西,这很简单。
如果您不能这样做,那么您需要在代码周围加try...catch
来清理。
#2的例子:
var Foo = function() {
var emitterHooked = false;
try {
someEventEmitter.on("event", this.someHandler);
emitterHooked = true;
throw new Error("Unexpected error happening in a constructor");
} catch (e) {
if (emitterHooked) {
try {
someEventEmitter.off("event", this.someHandler);
} catch (e2) { }
}
throw e;
}
};
当然,对于许多事件机制,你并不真正需要emitterHooked
变量,因为删除一个从未添加的变量是一个无操作,但这是为了强调你的事情类型在遵循这种方法时需要处理。
正如你所看到的那样,这真的很丑陋,因此排名第一。 : - )