2013-02-22 10 views
5

ECMA 262 5 specificationの実行コンテキスト/レキシカル環境セクションを読んでいます。関数式に独自のスコープ/レキシカル環境があります

字句環境は、ECMAScriptコードの字句ネスティング構造に基づいて識別子と特定の変数との関連付けを定義するために使用される仕様型です。レキシカル環境は、環境レコードと、場合によっては、外部レキシカル環境へのヌル参照とからなる。通常、レキシカル環境は、FunctionDeclaration、WithStatement、またはTryStatementのCatch節やそのようなコードが評価されるたびに新しいレキシカル環境などのECMAScriptコードの特定の構文構造に関連付けられます。

Function Expressionsのためのレキシカル環境を作成することについて何も言わないことに気付きました。関数式用に作成された字句環境か、関数宣言用にのみ作成された字句環境ですか?何か不足していますか?

編集:私は、その関数のコードは、関数式がレキシカル環境のセクションで言及されていない理由を私も混乱している理由である、its own execution contextを持つことになります注意してください。

+4

例のリストは "such as"で始まるので、私は網羅的であるとは考えていません。 – Pointy

+0

[セクション13](http://www.ecma-international.org/ecma-262/5.1/#sec-13)は、新しい字句環境が名前付きの関数式に対してのみ作成されることを示唆しているようです(無名関数ではありません)式または関数の宣言)。しかし、私はそれを間違って解釈する必要があります。 –

答えて

3

はい、すべての機能が取得する(§10.4.3§13.2.1)を呼び出すと、それ自身ExecutionContextとなります。その新しい文脈は、機能の[[Scope]]から派生した新しいLexicalEnvironmentNewDeclarativeEnvironmentによって作成され、§10.2.2.2)で初期化されます。つまり、LexicalEnvironment§13)で宣言/「表現」されました。

あなたが指摘した文章では、「... some [structure] ...」のように徹底的にリストアップしていません。

2

インスタンス化された関数には有効範囲があります。関数宣言文または関数のインスタンス化式の一部としてインスタンス化されたかどうかは関係ありません。

(それはインスタンス化機能は、それがと呼ばれる範囲を持っており、すべてのコールが明確な範囲を生成することと言うことはおそらくより正確だ。)

3

名前がFunctionExpressionに含まれている場合、その名前は同じ名前の外部宣言をシャドウする読み取り専用バインドになります。しかし、そのバインディング自体は、関数内の仮パラメータまたはローカル宣言によって隠される可能性があります。関数名に対するそのようなバインドは、名前がのFunctionExpressionsの場合にのみ作成され、匿名の場合は作成されません。 FunctionExpressionsまたはFunctionDeclarationsFunctionDeclarationの名前バインドは、周囲のVariableEnvironmentに作成されます。ここで

はES5.1仕様を参照してより詳細なexplantionです:

関数オブジェクトに関連付けられた複数の環境レコードがあります。関数が呼び出されるたびに、新しい関数DeclarativeEnvironmentRecordが作成され、特定の関数呼び出しのローカルバインディングが格納されます。そのレコードは、その呼び出しのために作成されたExecutionContextのVariableEnvironmentと最初のLexicalEnvironmentの両方になります。これはセクション10.4.3で規定されています。

この環境レコードが作成されると、呼び出されている関数オブジェクトの[スコープ]内部プロパティの値に「外部環境」が設定されます。 (行5、10.4.3)外部環境は、すべての非ローカル宣言のバインディングを提供します。 [[Scope]]は、関数オブジェクトが作成されるときに設定されます(13章および13.2節のセマンティクスを参照)。したがって、特定の関数オブジェクトのそれぞれの別個の呼び出しは、異なるローカル環境を持ちますが、その関数のすべての呼び出しは、同じ外部関数[[スコープ]]を共有します。

キャプチャされた[[Scope]]は、関数が作成されたときにアクティブだったExecutionContextのLexicalEnvironmentにすぎません。しかしFunctionExpressions 識別子を含むの関数名には、[[Scope]]チェーンの先頭に余分なDeclarativeEnvironmentRecordが挿入されています。 (セクション13の第3のアルゴリズムのステップ1〜3参照)。

この特別な環境レコードは、FunctionExpressionで指定された関数名のバインディングを取得するために使用されます。

関連する問題