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

Does this create a circular reference in javascript?

本文关键字:创建 循环 引用 javascript 是否      更新时间:2023-09-26

在确定 SQL 选择是否异步返回空集?我最终尝试使用对象的方法作为事件处理程序。 在事件处理程序的上下文中使用对象的正常"this"与方法的对象不对应(为什么,不确定,除了我目前对javascript的简单理解之外,我的猜测是由于变量名称的范围?

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

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

谢谢。

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

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

如果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;

这也取决于执行异步的实现方式。 如果内部实现没有将回调存储在最终回调之后的作用域中,那么它将被清理并删除s