グローバル オブジェクトは、トップレベルのレキシカル環境 (必要に応じて、スコープ チェーンのトップ) として機能します。これは、直接参照 (変数など) を介してグローバル プロパティにアクセスできることを意味します。
// global code
this.foo = 1; // creating a global property
foo // accessing the global property via a direct reference
これは、プロパティ参照を介してグローバル変数にアクセスできることも意味します。
// global code
var foo = 1; // creating a global variable
this.foo // accessing the global variable via a property reference
解釈 1
ここで、上記の情報に基づいて、「グローバル変数」と「グローバル プロパティ」という用語を同じ意味で使用することが適切であるように思われます。つまり、両方の用語がグローバル バインディングのまったく同じセットを表すことを意味します。
var
ただし、 ,egを使用して作成されたグローバル変数var foo = 1;
と、割り当てによって作成されたグローバル プロパティには、次の 2 つの違いがありますthis.foo = 1;
。
グローバル変数は静的にスコープされますが、グローバル プロパティはグローバル環境に動的に追加されます。
foo // => undefined bar // throws ReferenceError var foo = 1; this.bar = 1;
そのため、グローバル変数はプログラムの評価前にバインドされますが、グローバル プロパティはプログラムの評価中にバインドされ、代入が評価されます。
つまり、グローバル変数は削除できません (具体的には、対応するバインディングを後で環境から削除することはできません) が、代入によって作成されたグローバル プロパティは構成可能です。
// the names "foo" and "bar" are bound to the global environment var foo = 1; this.bar = 1; // the binding "bar" can be removed from the global environment subsequently delete this.bar; // the binding "foo" cannot be removed subsequently
そうは言っても、構成不可能なグローバル プロパティを作成できることに注意してください。
Object.defineProperty( this, 'bar', { value: 1 }); // non-configurable by default
解釈 2
現在、この新しい情報に基づいて、静的にスコープされたグローバル バインディングのみがグローバル プロパティとグローバル変数の両方として参照される可能性があると言えますが、動的に追加されたグローバル バインディングは単なるグローバル プロパティであり、グローバル変数ではありません。 variable" は、次のように、"global property" という用語で表されるセットのサブセットを表します。
すべてのグローバル変数はグローバル プロパティ
です 静的スコープのグローバル プロパティのみがグローバル変数です
では、どの解釈が正しいのでしょうか。両方の用語は同じ束縛のセットを表していますか、それとも一方が他方のサブセットですか?
質問
「グローバル プロパティ」という用語は理解しています。グローバル プロパティは、グローバル オブジェクトのプロパティです。ただし、「グローバル変数」という用語はあいまいなようです。var
「グローバル プロパティ」の同義語として使用する人もいれば、ステートメントを介して定義されたグローバル プロパティを意味すると定義する人もいます。私の質問の意図は、これら 2 つの意味のどちらが正しいかを判断することです。