2

何かを探して window オブジェクトをいじっていました。グローバル ウィンドウ オブジェクトが複数のレベルに複製されていることに気付きました。

試す:

console.log(window); // returns global window object
console.log(window.window); // returns global window object
console.log(window.window.window); // returns global window object
console.log(window.window.window.window); // returns global window object 
console.log(window.window.window.window.window); // returns global window object

console.log(window === window.window); // returns true
console.log(window.window.window === window.window.window.window); // returns true

window.zombie = "Zombie!";

console.log(window.zombie === window.window.zombie); // returns true

これを利用する方法はありますか?

4

4 に答える 4

5

実際にはマルチレベルではありません。それ自体を指すプロパティが 1 つだけあれば、再帰が可能になります。

例えば:

var zombie = {
    fred: 'Hello'
};

zombie.zombie = zombie;

あなたは今、ワイルドになって次のことを行うことができます:

alert(zombie.zombie.zombie.zombie.fred);

これが存在する理由のwindow詳細については、Kevin Brydons answer を参照してください。最初のレベルでは意味がありますが、残りは自己参照の副産物です。

于 2013-02-21T11:06:21.850 に答える
3

Mozilla は.windowプロパティの簡潔な説明を行いました

https://developer.mozilla.org/en-US/docs/DOM/window.window

そして抜粋:

window プロパティがオブジェクト自体を参照するようにするポイントは、(おそらく) グローバル オブジェクトを簡単に参照できるようにすることでした (そうしないと、スクリプトの先頭で手動で var window = this; 割り当てを行う必要があります)。

于 2013-02-21T11:08:13.300 に答える
2

window プロパティでオブジェクト自体を参照するポイントは、(おそらく) グローバル オブジェクトを参照しやすくするためです (そうしないと、スクリプトの先頭で手動で var window = this; を割り当てる必要があります)。

もう 1 つの理由は、このプロパティがないと、"window.open(' http://google.com/ ')" のように記述できないためです。"open(' http: //google.com/ ')" 代わりに。

このプロパティを使用するもう 1 つの理由は、ライブラリが OOP バージョンと非 OOP バージョン (特に JavaScript モジュール) を提供したい場合です。たとえば、「this.window.location.href」を参照する場合、JavaScript モジュールは定義したクラス内で「window」というプロパティを定義できます (デフォルトではグローバルな「window」変数が存在しないため)。 、たとえば、ウィンドウ オブジェクトをモジュール クラスのコンストラクターに渡した後に作成できます。したがって、その関数内の「this.window」はそのウィンドウ オブジェクトを参照します。名前空間のないバージョンでは、「this.window」は単純に「window」を参照し、問題なくドキュメントの場所を取得できます。

ソース

于 2013-02-21T11:08:28.480 に答える
1

MDNから:

window.window : 現在のウィンドウへの参照を返します。

この単純な参照は、オブジェクトを循環させます。

于 2013-02-21T11:06:18.667 に答える