在Determing if a SQL select returns an empty set asynchronously?中,我最终尝试将对象的方法用作事件处理程序。使用对象的正常“this”并不对应于事件处理程序上下文中方法的对象(为什么,不确定,除了我目前对javascript的简单理解之外,我的猜测是由于变量名称的范围?)。
正如我在之前的Q中提到的,http://w3future.com/html/stories/callbacks.xml,他们的解决方案是基本上每个对象提供一个“var me = this”变量。我的问题是,这是否会创建一个循环引用,以防止对象被垃圾收集?
如果是,有没有更好的方法来完成任务?
感谢。
答案 0 :(得分:2)
是的,这将创建一个循环引用。
然而,它不会引起任何问题 现代Javascript垃圾收集器可以很好地处理循环引用。 (在IE6中,除了DOM和用户对象之间的引用之外)
答案 1 :(得分:0)
如果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
如果你只是单独清除每个处理程序而不是语句对象,那也可以。假设您可以单独进行每个回调。
delete statement.executeAsync.handleResult;
delete statement.executeAsync.handleError;
delete statement.executeAsync.handleCompletion;
这还取决于executeAsync的实现方式。如果内部实现没有将回调存储在超过最终回调的范围内,那么在删除s