2017-01-25 20 views
1

グローバルスコープ内にナビゲータ変数を作成し、letキーワードを使用して文字列を割り当てました。グローバルlet変数はどこに格納されていますか?

// in a browser 
    let navigator = "Hello!"; 
    console.log(navigator);      // "Hello!" 
    console.log(window.navigator === navigator); // false 

ここlet navigator値はwindow.navigator影。しかし、正確にlet navigatorがどこに格納されているか知ることは非常に興味がありますか?

+1

Mozillaはこれを次のように記述しています(「https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/」)。 Webページで実行されるすべてのJSコードを概念的に囲む不可視のブロックです。 –

答えて

5

あなたはletではなくvarを使用しているので、それはむしろ、グローバルオブジェクト自体に比べ、グローバルlexical environment objectに関連付けられた宣言environment recordに保存されます。環境レコードおよびレキシカル環境オブジェクトは仕様メカニズムであり、コードで直接アクセスすることはできません(実際の実装はJavaScriptエンジンによって異なる場合があります)。

これはグローバルオブジェクト  —のプロパティではありません  —グローバルはES2015のよう導入された新しいものである概念です。それまでは、すべてのグローバルはグローバルオブジェクトのプロパティでした。 ES2015以降では、グローバルレベルlet,const、およびclassの識別子バインディングは、グローバルオブジェクトに保持されるのではなく、別の宣言的環境レコードに保持されます。

環境レコードおよび語彙環境オブジェクトは、関数内にローカル変数を格納するのと同じメカニズム(ES2015 +およびES5およびそれ以前の両方で)と同じメカニズムです。

これのグローバルな側面は§8.2.3 - SetGlobalRealmObjectで定義され、§8.1.2.5 - NewGlobalEnvironment(G, thisValue)となります。

+0

レキシカルスコープ内のすべての変数を検査する方法はありますか?同様に 'console.log(window)'と関連するすべての変数を見ることができます。 –

+0

@ GAkshay:いいえ。それはなぜグローバルオブジェクトから離れて、それらを発見不可能にする理由の一部です。モジュールの追加に伴い、グローバルオブジェクトをすべて使用することから離れることが目標です。 –

+0

(私はこれが以前の質問に対する答えによってカバーされているはずでした) –

関連する問題