在Determing if a SQL select returns an empty set asynchronously?中,我最终尝试使用对象的方法作为事件处理程序。在事件处理程序的上下文中使用对象的普通"this“并不对应于方法的对象(除了我目前对javascript的简单理解之外,我不确定为什么,我猜是由于变量名的作用域?)。
正如我在上一篇来自http://w3future.com/html/stories/callbacks.xml的Q中提到的,他们的解决方案基本上是让每个对象提供一个"var me = this“变量。我的问题是,这是否会创建一个循环引用,以防止对象被垃圾回收?
如果是这样,有没有更好的方法来完成这项任务?
谢谢。
发布于 2012-07-04 23:11:30
是的,这将创建一个循环引用。
但是,它不会造成任何问题。
现代的Javascript垃圾收集器可以很好地处理循环引用。(在IE6中,DOM和用户对象之间的引用除外)
发布于 2012-07-04 23:28:11
如果s和引用它的所有内容离开可访问范围或被手动删除,那么它将被垃圾回收。如果您删除了s,但statement.executeAsync仍然具有对回调的引用,则对me的引用也将保留。
delete s;
s; //undefined
//This will still contain the function reference
statement.executeAsync.handleResult;
delete statement; //Now s and me should be garbage collected如果只需要单独清除每个处理程序,而不是statement对象,也可以这样做。假设您可以单独访问每个回调。
delete statement.executeAsync.handleResult;
delete statement.executeAsync.handleError;
delete statement.executeAsync.handleCompletion;这还取决于executeAsync的实现方式。如果内部实现没有将回调存储在最终回调之后的作用域中,那么它将被清除,因为您删除了s
https://stackoverflow.com/questions/11331493
复制相似问题