【问题标题】:jQuery circular referencejQuery循环引用
【发布时间】:2014-03-04 10:24:03
【问题描述】:

我制作了一个 jQuery 插件/小部件作为 OOP 对象,并在该对象中将 HTML/jQuery 元素 ($elem) 保存为属性。我还将该对象的引用(使用new 创建)存储在HTML 元素的data 属性中。这会导致循环引用/内存泄漏吗?

CoffeeScript 中的代码大概是:

class wid
  constructor
    @$elem = $('<div>hello</div>')
    @$elem.appendTo('body')
    @$elem.data('obj',@)  // adding the instance to the element's data attribute
  updateText: (p)->
     @$ele.text(p)

widget = new wid()

【问题讨论】:

  • 请发布您的代码。
  • 作为 what 的属性?
  • 当该元素被删除时,数据属性中的数据会被清除,从而允许内存被清除。使用 jQuery 插件在元素数据中包含对对象实例的引用是很常见的。
  • data()是不是需要两个参数来设置数据,取回数据时只有一个?
  • 错字...更新了代码..

标签: jquery coffeescript


【解决方案1】:

在真正的浏览器上,不会。 Internet Explorer 是微软的浏览器形状的对象,它为 DOM 和 Javascript 提供了单独的垃圾收集器,因此很容易创建循环引用。由于 IE 与操作系统紧密集成,仅关闭浏览器并不能释放这些内存:必须重新启动操作系统。

不过,这是一件好事:随着 IE 变得越来越慢,被未释放的对象引用压得喘不过气来,用户学到了有关 Microsoft 质量的重要一课。

【讨论】:

  • 通过这个思考过程,我可以只用浏览器嗅探 IE 并故意运行会降低浏览器速度的代码。我认为您会发现用户将您的网站归咎于缓慢,而不一定是他们的特定浏览器。
  • @nzifnab 没错。抛开明显的偏颇不谈,值得注意的是,IE 自第 8 版以来就有一个标记和清除 GC,它不具有引用计数器对循环引用泄漏的一般敏感性。 (同样值得注意的是,对于我们这些自 1996 年以来显然没有看过窗外的人来说,杀死 iexplore.exe 进程将释放它分配的任何内存,就像 NT 机器上的任何其他进程一样。)
  • @nzifnab -- 这就是这个策略的美妙之处!它不会比任何其他网站更影响网站的工作 - 或浏览器而不是任何其他应用程序。所发生的只是他们以一种相对轻松的方式理解微软对用户体验的承诺。
  • @AaronMiller -- 问题不在于 GC 策略,而在于有两个独立的内存池,它们之间没有 GC 协调。至于内存问题,我自己没有测试过,只是照搬了微软公司关于这个问题的指导,是的,可能并不完全可靠。
  • @Malvolio 我想看看你所说的任何内容的主要来源。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多