1. ホーム
  2. javascript

[解決済み] なぜJavaScriptで定義される前の関数を使うことができるのですか?

2022-04-30 17:32:36

質問

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

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();

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

どなたかご教示ください。

どのように解決するのですか?

その function 宣言はマジックで、そのコードブロック*内の何かが実行される前に識別子がバインドされるようにします。

を使った代入とは異なります。 function 式は、通常の上から下への順序で評価されます。

という例に変えたら。

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

が動作しなくなる。

関数宣言と関数式は、見た目はほとんど同じで、場合によっては曖昧になることもありますが、構文的には全く別物です。

のドキュメントに記載されています。 ECMAScript標準 セクション 10.1.3 . 残念ながら、ECMA-262 は標準規格でもあまり読みやすい文書ではありません。

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