私は誰かが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;
window.onload = function(){ hookup(document.getElementById( 'menu')); function hookup(elem){ elem.attachEvent( "onmouseover"、mouse); function mouse(){ } } }
ご覧のとおり、ハンドラーはアタッチメント内にネストされています。つまり、ハンドラーは呼び出し元のスコープで閉じられています。
おそらく、循環オブジェクトを定義する最も短い方法です。
a = {}; a.a = a;
または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();
円形とクロージャー付き。