我一直想知道尽管存在内存泄漏,但是JavaScript中循环引用的用途是什么?浏览器中甚至window
对象都被循环引用,就像window.window.window .....
一样。我们为什么使用它以及在哪里可以使用它。它的优点是什么?
答案 0 :(得分:2)
我想知道尽管有内存泄漏,
没有内存泄漏,两个互相引用但未链接的对象被垃圾回收了。 window
对象将永远不会被收集,因此在这里也没关系。
javascript中循环引用的用途是什么?
与任何其他语言一样,它们可用于各种结构,例如树(父级<->子级),链表(左<->右)和多对多关系(学生<->类) 。如果没有它们,将会使某些形式的遍历变得复杂,并使程序运行速度大大降低。
为什么window.window是循环引用?
window
不仅是一个对象,而且还是最终查找所有变量的最全局范围。当您使用任何全局变量时,例如setTimeout
,它会在全局范围内查找,因此会在window
对象中查找。
window.setTimeout === /*window.*/setTimeout
现在,如果要引用全局对象,则必须在本身就是全局对象的全局范围中查找它。
window.window === /*window.*/window
因此,仅window
已经访问了循环引用,这就是为什么可以找到全局对象的原因。否则,window
必须是保留关键字。
答案 1 :(得分:-1)
请参阅此页面,有很大的理由 Why window.window property exists?
让window属性指向对象本身的观点很可能使引用全局对象变得容易。否则,您将必须执行手动var窗口= this;作业位于脚本的顶部。
另一个原因是,没有此属性,您将无法编写,例如“ window.open('http://google.com/')”。您必须改为使用“ open('http://google.com/')”。
。