我想知道是否有人有一个很好的、有效的 javascript 循环引用示例? 我知道用闭包来做到这一点非常容易,但我很难理解这一点。 如果我能在 Firebug 中剖析一个例子,我将非常感激。
谢谢
创建循环引用的一个简单方法是让一个对象在属性中引用自身:
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
现在超出了范围,它仍然是从函数范围中引用的。简单的垃圾收集器不会识别这个循环,也不会收集该函数。
或者更简单,一个“包含”自身的数组。参见示例:
var arr = [];
arr[0] = arr;
可能是定义循环对象的最短方法。
a = {}; a.a = a;
window.onload = 函数() { hookup(document.getElementById('菜单')); 函数连接(elem){ elem.attachEvent("onmouseover", 鼠标); 函数鼠标() { } } }
如您所见,处理程序嵌套在附加程序中,这意味着它在调用者的范围内关闭。
或者使用 ES6:
class Circular {
constructor() {
this.value = "Hello World";
this.self = this;
}
}
circular = new Circular();
你可以这样做:
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;
打印
a
或 b
将返回 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();
圆形且带有闭合件。
循环引用的真实示例
const person1 = {
name: "x",
age: 28,
};
const person2 = {
name: "y",
age: 26,
};
person1.spouse = person2;
person2.spouse = person1;
console.log(JSON.stringify(person1)); // will throw the error