Подтвердить что ты не робот

Пример круговой ссылки в Javascript?

Мне было интересно, есть ли у кого-нибудь хороший рабочий пример круговой ссылки в javascript? Я знаю, что это невероятно легко сделать с закрытием, но мне нелегко было обмотать мозг вокруг этого. Пример, который я могу проанализировать в Firebug, будет наиболее оценен.

Спасибо

4b9b3361

Ответ 1

Простым способом создания круговой ссылки является наличие объекта, который ссылается на себя в свойстве:

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 теперь выходит за пределы области видимости, он по-прежнему ссылается на область функций. Простые сборщики мусора не узнают этот цикл и не собирают функцию.

Ответ 2

Или даже проще, массив "содержащий" сам. Пример:

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

Ответ 3

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

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

    function mouse() {
    }
  }
}

Как вы можете видеть, обработчик вложен в attacher, что означает, что он закрыт по объему вызывающего.

Ответ 4

Вероятно, самый короткий способ определить циклический объект.

a = {}; a.a = a;

Ответ 5

Или используя ES6:

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

circular = new Circular();

Ответ 6

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

Печать a или b вернет Circular.

Ответ 7

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

Циркуляр и с закрытием.

Ответ 8

Вы можете сделать:

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