Javascript 中循环引用的示例?

问题描述 投票:0回答:9

我想知道是否有人有一个很好的、有效的 javascript 循环引用示例? 我知道用闭包来做到这一点非常容易,但我很难理解这一点。 如果我能在 Firebug 中剖析一个例子,我将非常感激。

谢谢

javascript closures
9个回答
73
投票

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

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
现在超出了范围,它仍然是从函数范围中引用的。简单的垃圾收集器不会识别这个循环,也不会收集该函数。


26
投票

或者更简单,一个“包含”自身的数组。参见示例:

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

20
投票

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

a = {}; a.a = a;

11
投票
window.onload = 函数() {
  hookup(document.getElementById('菜单'));

  函数连接(elem){
    elem.attachEvent("onmouseover", 鼠标);

    函数鼠标() {
    }
  }
}

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


4
投票

或者使用 ES6:

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

circular = new Circular();

4
投票

你可以这样做:

  • 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()

1
投票
var b = [];
var a = [];
a[0] = b;
b[0] = a;

打印

a
b
将返回
Circular


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

圆形且带有闭合件。


0
投票

循环引用的真实示例

const person1 = {
  name: "x",
  age: 28,
};

const person2 = {
  name: "y",
  age: 26,
};

person1.spouse = person2;
person2.spouse = person1;

console.log(JSON.stringify(person1)); // will throw the error
© www.soinside.com 2019 - 2024. All rights reserved.