首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这会在javascript中创建循环引用吗?

这会在javascript中创建循环引用吗?
EN

Stack Overflow用户
提问于 2012-07-04 22:57:59
回答 2查看 151关注 0票数 1

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

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

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-04 23:11:30

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

但是,它不会造成任何问题。

现代的Javascript垃圾收集器可以很好地处理循环引用。(在IE6中,DOM和用户对象之间的引用除外)

票数 2
EN

Stack Overflow用户

发布于 2012-07-04 23:28:11

如果s和引用它的所有内容离开可访问范围或被手动删除,那么它将被垃圾回收。如果您删除了s,但statement.executeAsync仍然具有对回调的引用,则对me的引用也将保留。

代码语言:javascript
复制
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对象,也可以这样做。假设您可以单独访问每个回调。

代码语言:javascript
复制
delete statement.executeAsync.handleResult;
delete statement.executeAsync.handleError;
delete statement.executeAsync.handleCompletion;

这还取决于executeAsync的实现方式。如果内部实现没有将回调存储在最终回调之后的作用域中,那么它将被清除,因为您删除了s

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11331493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档