ここでいうJavaScriptとは、ホスト環境を含むブラウザ環境を指します。 1 つ目は ECMAScript グローバル オブジェクトで、2 つ目はホスト環境 (Host) のグローバル オブジェクト/関数です。
1. コア JavaScript 組み込みオブジェクト、つまり、ホスト環境に依存しない ECMAScript 実装によって提供されるオブジェクト
これらのオブジェクトは、プログラムが実行される前にすでに存在 (インスタンス化) されています。 ECMAScript はグローバル オブジェクトと呼ばれ、次の種類に分類されます。
1. グローバルオブジェクトの値プロパティ。 NaN、無限大、未定義があります。
2. グローバルオブジェクトの関数プロパティ。 eval、parseInt、parseFloat、isNaN、isFinite、decodeURI、encodedURI、encodeURIComponentがあります
3. グローバル オブジェクトのコンストラクター プロパティ (グローバル オブジェクトのコンストラクター プロパティ)。 Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError があります。
4. グローバル オブジェクトのその他のプロパティは、Java では静的クラスとして認識され、クラス名 + ピリオド + メソッド名で直接使用できます。数学、JSON があります。
ECMAScript 仕様では、これらのグローバル オブジェクト (グローバル オブジェクト) には Writable プロパティがある、つまり Writable は true、enumerable (Enumerable) は false、つまり for in enumeration は使用できないと記載されています。 ECMAScript にはこのセクションがあります
特に指定しない限り、グローバル オブジェクトの標準組み込みプロパティには属性 {[[Writable]]: true、[[Enumerable]]: false、[[Configurable]]: true} があります。
仕様には、グローバル オブジェクトは書き換え可能であると記載されていますが、誰も書き換えません。これは単なるテストです。
次のようにコードをコピーします。
NaN = 11;
評価 = 22;
オブジェクト = 33;
数学 = 44;
アラート(NaN);
アラート(評価);
アラート(オブジェクト);
アラート(数学);<BR>
value 属性のグローバル オブジェクト、function 属性のグローバル オブジェクト、コンストラクター (クラス) 属性のグローバル オブジェクト、その他の属性のグローバル オブジェクトは、NaN、eval、Object、Math です。結果は次のとおりです
結果は、IE9 (pre3)/Safari で書き換えることができなかった NaN を除いて、それ以外はすべて書き換えられたことがわかります。ここでは 4 つだけをリストします。興味がある場合は、上記のグローバル オブジェクトを 1 つずつテストしてください。ここで重要なのは、誰もオーバーライドする人はいないものの、コア JavaScript 組み込みオブジェクトは一般にオーバーライドできるということです。
その列挙可能性をテストしてみましょう
次のようにコードをコピーします。
for(NaN の変数 a){
アラート(a);
}
for(eval の var a){
アラート(a);
}
for(オブジェクト内の変数){
アラート(a);
}
for(数学の変数 a){
アラート(a);
}
すべてのブラウザにポップアップはありません。つまり、プロパティは列挙されません。興味があれば、上記のすべてのグローバル オブジェクトの列挙プロパティを 1 つずつテストできます。もちろん、Firefox などの一部のブラウザでは、一部のグローバル オブジェクトを書き換えた後に列挙できます。
2. ホスト環境が提供するグローバルオブジェクト/関数
window、alert、setTimeout、document、location など、ほとんどのブラウザでは書き換えが制限されます。
次のようにコードをコピーします。
ウィンドウ = 55;
アラート(ウィンドウ);
この文はIEではエラーとなり不正コピーを促し、その後のポップアップボックスは実行されません。他のブラウザでは、window=55 が存在しない場合でもウィンドウがポップアップ表示されます。
アラートを再度書き換える
次のようにコードをコピーします。
アラート = 55;
コンソール.ログ(アラート);
Firefox/Chrome/Safari/Opera でエラーが報告され、対応するコンソールから 55 の出力が確認できます。ホスト環境によって提供されるグローバル オブジェクト/関数の書き換えをサポートしていないブラウザーもあれば、サポートできるブラウザーもあることがわかります。
グローバル変数を宣言するには、次の 2 つの方法があります。
次のようにコードをコピーします。
a1 = 11;
var a2 = 22;
for(ウィンドウ内のa){
if(a=='a1'||a=='a2'){
アラート(a)
}
}
上記のコードは IE で情報ボックスをポップアップ表示しません。IE の内部コンテンツは次のとおりです。
次のようにコードをコピーします。
//IE
with(host_object){//ウィンドウ
with(global_object){//グローバル
a1 = 11;
var a2 = 22;
}
}
つまり、a1 と a2 は、上記の 1 つ目のタイプとして JS エンジンによって提供される Global オブジェクトの属性であり、2 番目のホスティング環境によって提供される window オブジェクトの属性ではありません。したがって、IEのウィンドウ内ではa1とa2は存在しません。 IE が Global オブジェクトへの参照を提供する場合、次のコードによって情報ボックスがポップアップ表示される可能性があります。
次のようにコードをコピーします。
for(グローバルのa){
if(a=='a1'||a=='a2'){
アラート(a)
}
}
Firefox/Safari/Chrome/Opera の内部はおそらく以下のようになります
次のようにコードをコピーします。
//Firefox/Safari/Chrome/Opera
with(host_object){//ウィンドウ
a1 = 11;
var a2 = 22;
with(global_object){//グローバル
}
}
つまり、a1 と a2 は、前述の 2 番目のタイプであり、ホスト環境によって提供されるグローバル オブジェクト ウィンドウ上の属性です。したがって、ウィンドウ内で a1 と a2 の両方が存在すると、情報ボックスがポップアップ表示されます。
グローバル変数 window.a3 = 33 を宣言するサードパーティのメソッドを見てみましょう。これは、a3 がウィンドウのプロパティとしてウィンドウにハングされているため、in window の場合はすべてのブラウザで a3 を取得できることを示しています。