2

ECMAScript 仕様では、制御が関数内の関数の実行コンテキストに入ったときに何が起こるかについて詳しく説明しています。

function foo() {
  function bar() {

  }
  bar(); // Control will be given to the bar function.  Details specified by spec
}

制御がグローバル コードに入ったときに何が起こるかについての説明もあります。

<script>
  // Entering global code!  Details specified by spec
</script>

ただし、グローバルコードで定義された関数の制御に入ったときに何が起こるかを指定するものは何もありません。

<script>
  function foo() {
  }
  foo(); // Calling a function defined in the global environment...not specified by spec
</script>

編集:これが私にとって重要な理由は、グローバルコードによって呼び出される関数の内部 [[Scope]] プロパティがどうなるか興味があるからです。グローバルな実行コンテキストのレキシカル環境になると思いますが、仕様でこれを指定するものは何もありません。

4

2 に答える 2

3

あなたはその文を誤解していると思います ( §10.4.3、関数コードの入力から):

次の手順は、コントロールが function object F、提供されthisArgた呼び出し元、および提供された呼び出し元に含まれる関数コードの実行コンテキストに入ったときに実行されますargumentsList[…]

これは、入力する関数が に含まれている必要があるという意味ではなく、入力されるFコード(呼び出している)関数Fに含まれていることを意味します。

関数を呼び出すときに使用されるメソッドは、[[Call]]グローバル/ローカルで宣言または呼び出された関数を区別しません。

于 2013-02-27T22:33:21.307 に答える
0

グローバル コードで宣言された関数は、10.4.1 のステップ 2 のグローバル コードの宣言バインディングのインスタンス化中にインスタンス化されます。

これは、10.5 のステップ 5.c によって行われ、セクション 13 の最初のアルゴリズムによってそのような関数オブジェクトが実際に作成されます。これにより、関数の [[Scope]] が現在の実行コンテキストの VariableEnvironment に設定されることに注意してください。現在の実行コンテキストは、10.4.1 のステップ 1 によって (10.4.1.1 経由で) グローバル環境に設定されました。

于 2013-02-28T01:21:51.883 に答える