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
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.
Ou encore plus simple, un tableau "contenant" lui-même. Voir l'exemple:
var arr = [];
arr[0] = arr;
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.
Probablement le moyen le plus court de définir un objet cyclique.
a = {}; a.a = a;
Ou en utilisant ES6:
class Circular {
constructor() {
this.value = "Hello World";
this.self = this;
}
}
circular = new Circular();
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()
var b = [];
var a = [];
a[0] = b;
b[0] = a;
L'impression a
ou b
retournerait Circular
.
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.