「JavaScript: The Definitive Guide, 6th edition」を読んでいて、セクション「3.10.3 The Scope Chain」(55 ページ) に次のように記載されています -
「ローカル変数をある種の 実装定義オブジェクトのプロパティと考えると、変数のスコープについて考える別の方法があります。」
「実装定義オブジェクト」の意味を誰かが説明できますか?
「JavaScript: The Definitive Guide, 6th edition」を読んでいて、セクション「3.10.3 The Scope Chain」(55 ページ) に次のように記載されています -
「ローカル変数をある種の 実装定義オブジェクトのプロパティと考えると、変数のスコープについて考える別の方法があります。」
「実装定義オブジェクト」の意味を誰かが説明できますか?
ローカル変数は、仕様に示されているように、字句環境へのバインディングとして内部的に表されます(ES5 10.5-次の引用符の「env」は現在のスコープの字句環境を指していることに注意してください)。
コード内のVariableDeclarationおよびVariableDeclarationNoIndごとに、ソーステキストの順序で実行します。
dnをdの識別子とします。
varAlreadyDeclaredを、引数としてdnを渡してenvのHasBinding具象メソッドを呼び出した結果とします。
varAlreadyDeclaredがfalseの場合、
引数としてdnとconfigurableBindingsを渡して、 envのCreateMutableBinding具象メソッドを呼び出します。
引数としてdn、undefined、およびstrictを渡して、 envのSetMutableBinding具象メソッドを呼び出します。
スコープの字句環境にプログラムでアクセスできないため、これらのバインディングを表示することはできません。ただし、グローバル変数が(アクセス可能な)グローバルオブジェクトのプロパティになるのと同じように、ローカル変数をこの非表示のオブジェクトのプロパティと見なすことができることを意味します。
この概念は、上から引用したセクションの冒頭にうまくまとめられています。
すべての実行コンテキストには、VariableEnvironmentが関連付けられています。実行コンテキストで評価されたECMAScriptコードで宣言された変数と関数は、そのVariableEnvironmentの環境レコードにバインディングとして追加されます。
プロセスをより詳細に理解するには、およびメソッドの仕様を参照してください。CreateMutuableBinding
setMutableBinding
実際の質問に答えるために、この場合、「実装定義オブジェクト」は現在の実行コンテキストの字句環境です。
私たちに公開されていない抽象的なオブジェクトを考えてみてください。これは実装によって定義され、実装でのみ使用できます。「実装」とは、コードを実行する JavaScript エンジンを意味します。
たとえば、次の関数を考えてみましょう。
function f(a,b) {
var foo = 5;
return a + b + foo;
}
その関数のスコープ内で定義された変数と引数は、次のようなオブジェクトとして表すことができます。
{
a,
b,
foo
}
オブジェクトのプロパティの値は、関数の実行中に変更される可能性があります。たとえば、関数をf(1,2)
で呼び出すと、関数の実行が開始されるとすぐに、オブジェクトは次のようになります。
{
a: 1,
b: 2,
foo: undefined
}
foo
が割り当てられると、次5
のようになります。
{
a: 1,
b: 2,
foo: 5
}
このオブジェクトは、関数内で宣言されているかのように考えてください。したがって、関数内ではa
、b
、の値にアクセスできますが、関数外ではアクセスできません。foo