JavaScript のグローバル オブジェクトとは何か、このオブジェクトがどのクラスに属しているかを知りたいです。
そしてInfinity
、NaN
とはどのようundefined
にグローバル オブジェクトの一部なのですか?
JavaScript のグローバル オブジェクトとは何か、このオブジェクトがどのクラスに属しているかを知りたいです。
そしてInfinity
、NaN
とはどのようundefined
にグローバル オブジェクトの一部なのですか?
変数のスコープは関数によって JavaScript で定義され、関数は他の関数内にネストできます。
function foo() {
// new variable scope in here
var a = "a";
function bar() {
// another nested variable scope
var b = "b";
}
bar();
}
foo();
ただし、プログラムの実行時に定義されるデフォルトの「グローバル」変数スコープがあります。これは、関数によって作成されたすべてのスコープがネストされている基本変数スコープです。
だから何?
さて、すべての変数スコープには変数オブジェクト(より正確には「バインディング」オブジェクト) があります。これは、作成したすべてのローカル変数がバインドされる内部オブジェクトです。
この変数オブジェクトには直接アクセスできません。ローカル変数(または関数パラメーター、または関数宣言)を宣言することによってのみ、プロパティを追加できます。また、変数名を介してのみプロパティにアクセスできます。
もう一度、だから何?
「グローバル」変数のスコープは一意です。オブジェクト自体を参照するオブジェクトのプロパティを自動的に定義することにより、この内部変数オブジェクトを公開します。ブラウザでは、プロパティの名前はwindow
です。
オブジェクトを参照するプロパティがオブジェクトに配置され、オブジェクトのプロパティが変数になるため、グローバル変数オブジェクトに直接アクセスできるようになりました。
プロパティが変数window.window
への等しい参照であることを観察することで、これをテストできます。window
alert(window.window === window); // true
その結果、オブジェクトwindow.foo = "bar";
にプロパティを追加でき、グローバル変数として表示されますalert(foo); // "bar"
。
この内部オブジェクトを公開する唯一の変数スコープはグローバル スコープであることに注意してください。どの関数スコープもそれを公開しません。
また、ECMAScript 仕様では、グローバル変数オブジェクトを公開する必要がないことにも注意してください。決定するのは実装次第です。
実際のクラスはありませんが、グローバル オブジェクトのプロトタイプ チェーンを意味する場合、仕様は多くを語っていません。
グローバル オブジェクトの [[Prototype]] および [[Class]] 内部プロパティの値は、実装に依存します。
([[Class]] は、たとえばwindow.toString()
、取得できるように使用されます"[object global]"
。)
あなたが言及した 3 つの値は、グローバル オブジェクトのプロパティです。
Infinity === window.Infinity; // true (in a browser the global object is window)
これらの変数は上書きできないため、リテラルとして表示できます。しかし実際には、それらはグローバル オブジェクトのプロパティであるため、変数 (「グローバル変数」) として参照できます。