Mat*_*ewJ 46 javascript closures
我想知道是否有人在javascript中有一个好的,有效的循环引用示例?我知道这对于闭合来说非常容易,但是很难将我的大脑包裹起来.我可以在Firebug中剖析一个例子,我将不胜感激.
谢谢
sth*_*sth 55
创建循环引用的一种简单方法是在属性中引用自身的对象:
function Foo() {
this.abc = "Hello";
this.circular = this;
}
var foo = new Foo();
alert(foo.circular.circular.circular.circular.circular.abc);
Run Code Online (Sandbox Code Playgroud)
这里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();
Run Code Online (Sandbox Code Playgroud)
这里保存的函数circular引用circular变量,从而引用自身.它隐含地包含对自身的引用,创建循环引用.即使circular现在超出范围,它仍然从函数范围引用.简单的垃圾收集器将无法识别此循环,也不会收集该函数.
Ala*_*Kis 18
甚至更简单,一个"包含"自身的数组.见例子:
var arr = [];
arr[0] = arr;
Run Code Online (Sandbox Code Playgroud)
Jos*_*ola 11
window.onload = function() {
hookup(document.getElementById('menu'));
function hookup(elem) {
elem.attachEvent( "onmouseover", mouse);
function mouse() {
}
}
}
如您所见,处理程序嵌套在attacher中,这意味着它在调用者的范围内是封闭的.