web-dev-qa-db-ja.com

JavaScriptの循環参照の例?

私は誰かがJavaScriptの循環参照の良い実用的な例を持っているかどうか疑問に思っていましたか?これはクロージャで非常に簡単にできることを知っていますが、これに頭を悩ませるのに苦労しました。 Firebugで分析できる例が最もありがたいです。

ありがとう

43
MatthewJ

循環参照を作成する簡単な方法は、プロパティでそれ自体を参照するオブジェクトを作成することです。

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がスコープ外になった場合でも、関数スコープから参照されます。単純なガベージコレクターはこのループを認識せず、関数を収集しません。

50
sth

あるいはもっと簡単に言えば、それ自体を「含む」配列です。例を参照してください:

var arr = [];
arr[0] = arr;
17
Alan Kis
window.onload = function(){
 hookup(document.getElementById( 'menu')); 
 
 function hookup(elem){
 elem.attachEvent( "onmouseover"、mouse); 
 
 function mouse(){
} 
} 
}

ご覧のとおり、ハンドラーはアタッチメント内にネストされています。つまり、ハンドラーは呼び出し元のスコープで閉じられています。

11
Josh Stodola

おそらく、循環オブジェクトを定義する最も短い方法です。

a = {}; a.a = a;
10
cychoi

またはES6を使用:

class Circular {
  constructor() {
    this.value = "Hello World";
    this.self = this;
  }
}

circular = new Circular();
3
codeepic

できるよ:

  • _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()
2
Thomas Smith
var b = [];
var a = [];
a[0] = b;
b[0] = a;

aまたはbを印刷すると、Circularが返されます。

1
Psi
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();

円形とクロージャー付き。

1
Liucw