【问题标题】:What is the use of cyclic reference in javascriptjavascript中循环引用有什么用
【发布时间】:2019-06-14 11:06:46
【问题描述】:

我想知道尽管内存泄漏,javascript 中循环引用的用途是什么?甚至浏览器中的window 对象也是循环引用的,如window.window.window .....。我们为什么使用它以及我们可以在哪里使用它。它的优点是什么?

【问题讨论】:

  • 想到的一个用例是polyfilling WeakMap 类。
  • 循环引用不会导致现代浏览器内存泄漏
  • @obfish 需要详细说明吗?垃圾回收如何判断循环引用是否仍在使用?
  • @patrick well just WeakMap = ... 也可以在非严格模式下工作。

标签: javascript object circular-reference


【解决方案1】:

看到这个页面,有很多理由 Why window.window property exists?

让 window 属性引用对象本身的意义在于,可能更容易引用全局对象。否则,您必须手动执行 var window = this;脚本顶部的作业。

另一个原因是,如果没有此属性,您将无法编写例如“window.open('http://google.com/')”。您必须改用“open('http://google.com/')”。

.

也可以看看这个答案 https://stackoverflow.com/a/35788599/1475257

【讨论】:

    【解决方案2】:

    我想知道尽管内存泄漏,

    没有内存泄漏,两个相互引用但未链接到其他任何地方的对象会被垃圾收集。 window 对象将永远不会被收集,因此在这里并不重要。

    在 javascript 中循环引用有什么用?

    与任何其他语言一样,它们可用于各种结构,例如树(父 子)、链表(左 右)和多对多关系(学生 班级) .没有它们会使某些形式的遍历变得复杂,并使程序显着变慢。

    为什么 window.window 是循环引用?

    window 不仅是一个对象,它也是最终查找所有变量的最全局范围。当您使用任何全局变量时,例如 setTimeout,它会在全局范围内查找,因此会在 window 对象中查找。

     window.setTimeout === /*window.*/setTimeout
    

    现在如果要引用全局对象,就必须在全局范围内查找它,它本身就是全局对象。

     window.window === /*window.*/window
    

    因此只有window 已经访问了循环引用,这就是为什么可以找到全局对象的原因。否则window 必须是保留关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 2014-12-27
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多