w3schools namespacing functions closure javascript closures

namespacing - Ejemplo de una referencia circular en Javascript?



scope javascript (8)

O incluso más simple, una matriz que "contiene" a sí misma. Ver ejemplo:

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

Me preguntaba si alguien tiene un buen ejemplo de una referencia circular en javascript. Sé que esto es increíblemente fácil de hacer con los cierres, pero me ha costado adaptar mi cerebro a esto. Un ejemplo que puedo analizar en Firebug sería muy apreciado.

Gracias


O usando ES6:

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


Probablemente la forma más corta de definir un objeto cíclico.

a = {}; a.a = a;


Tu puedes hacer:

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

Una forma simple de crear una referencia circular es tener un objeto que se refiera a sí mismo en una propiedad:

function Foo() { this.abc = "Hello"; this.circular = this; } var foo = new Foo(); alert(foo.circular.circular.circular.circular.circular.abc);

Aquí el objeto foo contiene una referencia a sí mismo.

Con los cierres esto suele ser más implícito, al tener la referencia circular en el alcance, no como una propiedad explícita de algún objeto:

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

Aquí la función guardada en circular refiere a la variable circular , y por lo tanto a sí misma. Implícitamente contiene una referencia a sí mismo, creando una referencia circular. Aunque circular ahora está fuera del alcance, todavía se hace referencia desde el alcance de las funciones. Los recolectores de basura simples no reconocerán este bucle y no recogerán la función.


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

Circular y con cierres.


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

Imprimir b sería devolver Circular .


window.onload = function() { hookup(document.getElementById(''menu'')); function hookup(elem) { elem.attachEvent( "onmouseover", mouse); function mouse() { } } }

Como puede ver, el controlador está anidado dentro del atacante, lo que significa que está cerrado sobre el alcance de la persona que llama.