我想知道是否有人在javascript中有一个好的,有效的循环引用示例?我知道这对于闭合来说非常容易,但是很难将我的大脑包裹起来。我可以在Firebug中剖析一个例子。
由于
答案 0 :(得分:49)
创建循环引用的一种简单方法是使对象在属性中引用自身:
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
现在超出范围,它仍然从函数范围引用。简单的垃圾收集器将无法识别此循环,也不会收集该函数。
答案 1 :(得分:17)
甚至更简单,一个“包含”自身的数组。见例:
var arr = [];
arr[0] = arr;
答案 2 :(得分:11)
window.onload = function() { hookup(document.getElementById('menu')); function hookup(elem) { elem.attachEvent( "onmouseover", mouse); function mouse() { } } }
如您所见,处理程序嵌套在attacher中,这意味着它在调用者的范围内被关闭。
答案 3 :(得分:10)
可能是定义循环对象的最短方法。
a = {}; a.a = a;
答案 4 :(得分:3)
或使用ES6:
class Circular {
constructor() {
this.value = "Hello World";
this.self = this;
}
}
circular = new Circular();
答案 5 :(得分:2)
你可以这样做:
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()
答案 6 :(得分:1)
var b = [];
var a = [];
a[0] = b;
b[0] = a;
打印a
或b
将返回Circular
。
答案 7 :(得分:1)
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();
循环并有封闭。