これは、 JScript RuntimeObject (MSDN) を使用したデバッグに関する記事です。これらの例のほとんどは他のブラウザでは動作しませんが、IE 5.5 以降では動作します。
漏洩したグローバル識別子
たとえば、次のようなグローバル プロパティを誤って作成したとします。
関数 playRugby(プレイヤー) {
var 項目、
私;
len = 項目.長さ;
// グローバル。
}
関数キック() {
変数 x = 10
y = 11;
// y をグローバルにします。
}
playRugby が呼び出されると、グローバル プロパティ len が作成され、まだ存在しない場合は items.length の値が割り当てられます。同様に、kick が呼び出されると、グローバル プロパティ y が作成されます。
これらのグローバル変数はいずれも意図的なものではありません。これらはカプセル化を破壊し、実装の詳細を明らかにします。これにより、競合や厄介な依存関係の問題が発生する可能性があります。
これらの誤って作成されたグローバル識別子を検出するには、グローバル オブジェクトに対して for in ループを使用します。 Firebug の「DOM」タグは、この便利なグローバル検出を提供します。
残念ながら、IE では、for in はグローバル変数や関数宣言を列挙できません。次の例を見てください。
// グローバル変数オブジェクトのプロパティ。
var EX1_GLOBAL_VARIABLE = 10;
// グローバルオブジェクトのプロパティ。
this.EX1_GLOBAL_PROPERTY = 11;
// グローバル変数オブジェクトのプロパティ。
関数 EX1_GLOBAL_FUNCTION(){}
(関数(){
var 結果 = [];
for(この中の変数 p) {
結果.push(p);
}
alert("漏洩:n" + results.join("n"));
})();
IE では、結果にはウィンドウ プロパティと 4 つのユーザー定義プロパティ (EX1_GLOBAL_PROPERTY) のいずれかの組み合わせが含まれます。
では、他の 3 つのユーザー定義プロパティはどうなるでしょうか?なぜ for in ループに表示されないのでしょうか。
グローバル オブジェクトを列挙すると、割り当てられたグローバル オブジェクトのプロパティは列挙されますが、グローバル変数は列挙されないことがわかります。
グローバル プロパティは列挙できるが、グローバル変数は列挙できない理由。経験上、JScript はグローバル変数 (var で宣言) を DontEnum としてマークします。グローバル オブジェクトはグローバル変数オブジェクトとして定義されているため、これは合理的な説明のように思えます。これは標準ではありませんが、IE での動作を説明しています。しかし、Eric Lippert は別の説明を提案しました。グローバル オブジェクトとグローバル変数オブジェクトは、IE では 2 つの異なるオブジェクトです。
MS-ES3 によると:
JScript 5.x の変数宣言は、DontEnum 属性を持つグローバル オブジェクトのプロパティを作成します。