web-dev-qa-db-fra.com

Exemple d'une référence circulaire en Javascript?

Je me demandais si quelqu'un avait un bon exemple fonctionnel d'une référence circulaire en javascript? Je sais que c'est incroyablement facile à faire avec les fermetures, mais j'ai eu du mal à m'en occuper. Un exemple que je peux disséquer dans Firebug serait très apprécié.

Merci

43
MatthewJ

Un moyen simple de créer une référence circulaire consiste à avoir un objet qui se réfère à lui-même dans une propriété:

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

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

Ici, l'objet foo contient une référence à lui-même.

Avec les fermetures, cela est généralement plus implicite, en ayant simplement la référence circulaire dans la portée, et non en tant que propriété explicite d'un objet:

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

Ici, la fonction enregistrée dans circular fait référence à la variable circular, et donc à elle-même. Il contient implicitement une référence à lui-même, créant une référence circulaire. Même si circular sort maintenant de la portée, il est toujours référencé à partir de la portée des fonctions. Les simples garbage collectors ne reconnaîtront pas cette boucle et ne collecteront pas la fonction.

50
sth

Ou encore plus simple, un tableau "contenant" lui-même. Voir l'exemple:

var arr = [];
arr[0] = arr;
17
Alan Kis
window.onload = function () {
 branchement (document.getElementById ('menu')); 
 
 branchement de fonction (elem) {
 elem.attachEvent ( "onmouseover", souris); 
 
 fonction souris () {
} 
} 
}

Comme vous pouvez le voir, le gestionnaire est imbriqué dans l'attacheur, ce qui signifie qu'il est fermé sur la portée de l'appelant.

11
Josh Stodola

Probablement le moyen le plus court de définir un objet cyclique.

a = {}; a.a = a;
10
cychoi

Ou en utilisant ES6:

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

circular = new Circular();
3
codeepic

Tu peux faire:

  • 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()
2
Thomas Smith
var b = [];
var a = [];
a[0] = b;
b[0] = a;

L'impression a ou b retournerait Circular.

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

Circulaire et avec fermetures.

1
Liucw