7

この質問 ( ID でアクセス可能な要素) は、要素に ID がある場合、その ID に基づいて変数名でアクセスできることを示しています。Visual Studio 2010 を使用して開発しているときにこの変数が利用できるのを見たので、興味をそそられました。好奇心からいくつかテストを行ったところdocument.getElementById()、変数名を使用するよりも高速であることがわかりました。そのため、ウィンドウを調べてみましたが、変数が実際に保存されている場所を見つけることができませんでしたwindow["idName"]console.log(window)

要素が html で定義されている場合<div id="foo">、変数を使用して javascript で使用できますfoo(これを使用することをお勧めしているわけではありません。これは悪い習慣です)。その変数はどこに保存されていますか?

4

1 に答える 1

7

これは非標準の動作です。それがどこに(そしてもし)保存されるかは、実装次第です。


Linux で使用Firefox 15すると、実際のオブジェクトを見つけるために 2 つのプロトタイプ オブジェクトを深く掘り下げる必要がありました。この StackOverflow ページでこのコードを実行したところ、true結果が得られました。

Object.getPrototypeOf(Object.getPrototypeOf(window)).hasOwnProperty("hlogo");

Linux 上の Chrome では、1 レベルの深さでした。

Object.getPrototypeOf(window).hasOwnProperty("hlogo");

実際に Firefox でそれを見て驚いたのですが、Chrome は Microsoft のパターンを踏襲していたので、Firefox もそれに倣う必要性を感じたのではないでしょうか。


プロトタイプ チェーンの深さが分からない場合は、ループを実行してさまざまなオブジェクトを配列に追加するか、ループ内のオブジェクトを操作するだけです。

var protos = [],
    obj = window;

while (Object.getPrototypeOf(obj) !== null) {
    obj = Object.getPrototypeOf(obj);
    protos.push(obj);
}

alert("The object had " + protos.length + " prototype objects");
于 2012-10-01T20:03:23.153 に答える