Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。2万件165JavaScriptでの関数定義には2つあるみたいですが、違いや使い分けがわからないので教えて下さい。b);でよいのでしょうか。票11両者の本質的な違いは、「式(Expression)」か「文(Statement)」かだと考えます。関数定義式パターン2の書き方は関数定義式と呼びます。...}JavaScriptには巻上げという特異な仕様があり、実際には上の記述は以下のように分解されます。...}また、ここで行われている処理は、匿名関数を変数hogeへ代入する処理です。hoge()で実行することはできますが、この関数自体がhogeという名前は持っていません。名前を持たせるためには、以下のように宣言する必要があります。対して、パターン1の書き方は関数宣言文と呼ばれます。...}文の巻上げは関数定義そのものに発生するという特徴があり、その結果、スコープ内であればどこからでも呼び出すことができます。関数宣言文で定義した関数は、必ず名前を持つという特徴があります。|9定義されるタイミングの違いについてmozillaに説明がありました。|6違いはいつ定義されるかという点です。以下の例でfunctionOneは実行時に定義されますが、functionTwoは構文解析時に定義されます。}</script>また、functionTwoの定義方法では、strictモードの場合、条件節と共に使用することができなくなります。strict"がなければエラーにはならず、functionThreeはtestの値に関係なく、定義されることになります。この回答は、英語版にある同様の質問に対する@Gregさんの正解回答を簡易的に訳したものです。|1パターン2の使い道は、主にコールバックです。関数を数値や文字列同様、変数に代入できます、ということは、関数に引数として渡すことも可能です。非同期処理などで何か行い、完了時に知らせて欲しい場合は、次のようにコールバックすることができます。どちらも同じ関数として扱うことができます。違いは、「その行の実行時に関数が定義される」か、それとも「ファイルの読み込み時(パース時)に関数が定義されるか」です。書き方で推奨されていたりします。その理由の一つもこれです。}}と定義してしまうと、実行時に始めて関数が100回定義されてしまうため、パターン1よりも負荷が高くなってしまいがちです。|13100さんのに同英語版の別解答から付け足すと、パターン1はhogeという名の関数を宣言してますが、パターン2では無名関数を宣言し、それを変数hogeに入れていることになります。function(){};とすることでグローバルに定義できます。変数を使うことでeval()内で使ってもスコープが何処だかはっきりするので、デバッグが楽であり、ブラウザ間での互換性を保つことが出来ます(eval内で関数宣言するとブラウザごとに宣言される位置が違うらしい...)。パターン2は無名関数なので、Function.name(非標準、IEはサポートしてません)が以下のように空文字になります。|1挙動の違いは少なくて実質交換可能でも、意味としての違いがあります。オブジェクトにいろいろ入れて返すような場合、つまり関数を値として生成したい場合はパターン2で書かれると思います。その関数を関数内で使いたい場合、つまり関数を関数として設置したい場合はパターン1で書かれると思います。挙動の差があまりないので、気分で変えたり、なるべくどちらかに統一しているような人も多いかもしれません。因みに挙動の差としては巻き上げの他に、パターン1ではブロックスコープになるということがあります。fn()が、変数fnに上書きされているだけのように見えます。関数がスコープを持つという点ではパターン1も2も変わらないと思います。擬似ブロックスコープを作るために、無名の即時関数が利用されることはよくありますが。3:48例があまり良くなかったので修正しました。この挙動はES6のもので既にChromeなどでサポートされています。5:47なるほど、ES6では未定義だったブロック内での文での関数宣言がlet相当になる機能のことですね。ここでの「JavaScript」は前提としてメインストリームであるES5を指しているものと考えておりました、失礼しました。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。