Javascript中循环引用的示例?

时间:2009-09-29 15:55:38

标签: javascript closures

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

由于

8 个答案:

答案 0 :(得分:49)

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

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

var foo = new Foo();
alert(foo.circular.circular.circular.circular.circular.abc);

此处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();

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

答案 1 :(得分:17)

甚至更简单,一个“包含”自身的数组。见例:

var arr = [];
arr[0] = arr;

答案 2 :(得分:11)

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

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

    function mouse() {
    }
  }
}

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

答案 3 :(得分:10)

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

a = {}; a.a = a;

答案 4 :(得分:3)

或使用ES6:

class Circular {
  constructor() {
    this.value = "Hello World";
    this.self = this;
  }
}

circular = new Circular();

答案 5 :(得分:2)

你可以这样做:

  • window.window...window
  • var circle = {}; circle.circle = circle;
  • var circle = []; circle[0] = circle; or circle.push(circle)
  • function Circle(){this.self = this}; var circle = new Circle()

答案 6 :(得分:1)

var b = [];
var a = [];
a[0] = b;
b[0] = a;

打印ab将返回Circular

答案 7 :(得分:1)

function circular(arg){
    var count = 0;

    function next(arg){
        count++;
        if(count > 10) return;
        if(arg){
            console.log('hava arg: ' + arg);
            next();
        }else{
            console.log('no arg');
            next('add');
        }
    }
    next();
}
circular();

循环并有封闭。