Javascript中循环引用的示例?

Mat*_*ewJ 46 javascript closures

我想知道是否有人在javascript中有一个好的,有效的循环引用示例?我知道这对于闭合来说非常容易,但是很难将我的大脑包裹起来.我可以在Firebug中剖析一个例子,我将不胜感激.

谢谢

sth*_*sth 55

创建循环引用的一种简单方法是在属性中引用自身的对象:

function Foo() {
  this.abc = "Hello";
  this.circular = this;
}

var foo = new Foo();
alert(foo.circular.circular.circular.circular.circular.abc);
Run Code Online (Sandbox Code Playgroud)

这里foo对象包含对自身的引用.

对于闭包,这通常更隐式,只是在范围内使用循环引用,而不是某个对象的显式属性:

var circular;

circular = function(arg) {
  if (arg) {
    alert(arg);
  }
  else {
    // refers to the |circular| variable, and by that to itself.
    circular("No argument");
  }
}

circular("hello");
circular();
Run Code Online (Sandbox Code Playgroud)

这里保存的函数circular引用circular变量,从而引用自身.它隐含地包含对自身的引用,创建循环引用.即使circular现在超出​​范围,它仍然从函数范围引用.简单的垃圾收集器将无法识别此循环,也不会收集该函数.


Ala*_*Kis 18

甚至更简单,一个"包含"自身的数组.见例子:

var arr = [];
arr[0] = arr;
Run Code Online (Sandbox Code Playgroud)


Jos*_*ola 11

window.onload = function() {
  hookup(document.getElementById('menu'));

  function hookup(elem) {
    elem.attachEvent( "onmouseover", mouse);

    function mouse() {
    }
  }
}

如您所见,处理程序嵌套在attacher中,这意味着它在调用者的范围内是封闭的.


cyc*_*hoi 10

可能是定义循环对象的最短方法.

a = {}; a.a = a;
Run Code Online (Sandbox Code Playgroud)