这是否在javascript中创建循环引用?

时间:2012-07-04 14:57:59

标签: javascript

Determing if a SQL select returns an empty set asynchronously?中,我最终尝试将对象的方法用作事件处理程序。使用对象的正常“this”并不对应于事件处理程序上下文中方法的对象(为什么,不确定,除了我目前对javascript的简单理解之外,我的猜测是由于变量名称的范围?)。

正如我在之前的Q中提到的,http://w3future.com/html/stories/callbacks.xml,他们的解决方案是基本上每个对象提供一个“var me = this”变量。我的问题是,这是否会创建一个循环引用,以防止对象被垃圾收集?

如果是,有没有更好的方法来完成任务?

感谢。

2 个答案:

答案 0 :(得分:2)

是的,这将创建一个循环引用。

然而,它不会引起任何问题 现代Javascript垃圾收集器可以很好地处理循环引用。 (在IE6中,除了DOM和用户对象之间的引用之外)

答案 1 :(得分:0)

如果s和引用它的所有内容都留下了可访问的范围或被手动删除,那么它将被垃圾收集。如果您删除了sstatement.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

后会清除它