[解決済み] なぜ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 は標準規格でもあまり読みやすい文書ではありません。
*: 含有する関数、ブロック、モジュール、またはスクリプト。
関連
-
JavaScriptの配列共通メソッド解説
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] JavaScriptで変数が存在するか(定義されているか/初期化されているか)をチェックする
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
vueにおけるfilterの適用シーンについて解説します。
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
JavaScriptのStringに関する共通メソッド
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。