JavaScript で定義される前に関数を使用できるのはなぜですか? 質問する

JavaScript で定義される前に関数を使用できるのはなぜですか? 質問する

このコードは、異なるブラウザでも常に機能します。

function fooCheck() {
  alert(internalFoo()); // We are using internalFoo() here...

  return internalFoo(); // And here, even though it has not been defined...

  function internalFoo() { return true; } //...until here!
}

fooCheck();

しかし、なぜそれが機能するのかについての言及は 1 つも見つかりませんでした。私はこれを John Resig のプレゼンテーション ノートで初めて見ましたが、言及されているだけでした。実際、そこにも、どこにも説明がありません。

誰か私に教えていただけませんか?

ベストアンサー1

このfunction宣言は魔法であり、コードブロック* 内の何かが実行される前にその識別子がバインドされます。

functionこれは、通常のトップダウン順序で評価される式を使用した割り当てとは異なります。

例を次のように変更すると、

var internalFoo = function() { return true; };

動作しなくなります。

関数宣言は、関数式とはほとんど同じに見え、場合によってはあいまいになることもありますが、構文的には完全に分離されています。

これは、ECMAScript 標準、 セクション10.1.3残念ながら、ECMA-262 は標準規格から見てもあまり読みやすい文書ではありません。

*: 含まれる関数、ブロック、モジュール、またはスクリプト。

おすすめ記事