Пример круговой ссылки в Javascript?
Мне было интересно, есть ли у кого-нибудь хороший рабочий пример круговой ссылки в javascript? Я знаю, что это невероятно легко сделать с закрытием, но мне нелегко было обмотать мозг вокруг этого. Пример, который я могу проанализировать в Firebug, будет наиболее оценен.
Спасибо
Ответы
Ответ 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()