- ベストアンサー
「関数定義」と「関数宣言」の違い
JavaScriptで、「関数定義」と「関数宣言」に違いはあるでしょうか? リンク先に下記表現があるのですが、どういう意味でしょうか? >これが関数定義。(正確には関数定義の関数宣言にあたる) ・http://d.hatena.ne.jp/sandai/20110824/p1
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ECMAScript 5 では「生成規則 FunctionDeclaration」(関数宣言) によって関数宣言されます。 ECMAScript 5 では上述を 13 Function Definition (関数定義)によって説明しており、定義と宣言を混同する一因になっているように思われます。 ES3 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/13_Function_Definition.html ES5 http://es5.github.io/#x13 > これが関数定義。(正確には関数定義の関数宣言にあたる) 「関数定義によって関数宣言する」の意図と想像しますが、生成規則は FunctionDeclaration」(関数宣言) なので、ちょっと違う気がします。 あえて説明するなら 「生成規則 FunctionDeclaration」(関数宣言) によって関数定義し、関数宣言する」 でしょうか。 余計にわかりづらいので、 「生成規則 FunctionDeclaration」(関数宣言) によって関数宣言する」 でいいんでないでしょうか。 最終的には「定義」と「宣言」の日本語上の意味に該当しますので、文章上の文脈を見て判断すればいいのではないかと。 --- # 以下、余談。 MDNでは「関数宣言 (function 文)」とありますが、function に文はないので正確な言葉を使いたいなら気をつけてください。 この文脈なら「関数宣言 (FunctionDeclaration)」と表現すべきだと思います。 意訳にしてもせめて関数定義(Function Definition)にしてもらわないと。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope#.E9.96.A2.E6.95.B0.E5.AE.A3.E8.A8.80_.28function_.E6.96.87.29 英文の時点ですでに間違っているので翻訳者の責任ではないのですけど、MDNは表現が怪しいことが多々あるので ECMA を参照することをお勧めします。 ■間違った記述例ページ https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope#.E9.96.A2.E6.95.B0.E5.AE.A3.E8.A8.80_.28function_.E6.96.87.29 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function
その他の回答 (3)
- think49
- ベストアンサー率59% (285/482)
余談(function 文)の続き。 --- nanto_vi さんはMozilla Firefox における if (x) { function world () {} } の仕様を FunctionStatement と表現していて、FunctionDeclaration (関数宣言) と FunctionStatement (関数文) を明確に使い分けています。 http://nanto.asablo.jp/blog/2005/12/10/ しかしながら、MDN では上記コードは FunctionExpression (関数式) 扱いです。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression 結論としては、MDNにおける function 文は FunctionDeclaration (関数宣言) と等価と見て良さそうです。 # この仕様は ECMAScript 6 で取り込まれたんでしたっけ…。(うろ覚えで確信なし)
お礼
補足ありがとうございましたー
- hitomura
- ベストアンサー率48% (325/664)
リンク先を読みましたが、たぶんうっかりなんでしょうが括弧の中ちょっと間違えてますね。 「(正確には関数定義と関数宣言にあたる)」が正しいです。つまり、 function hoge() { // …… } でhoge()という関数があるという宣言とhoge()という関数の処理内容の定義の両方をやっているんです。 そのページの「関数定義の名前」のところを読めばわかるのですが、JavaScriptでは関数宣言は常に関数定義と一緒に行います。したがって、関数宣言だけが単独で出てくることはありません。 まとめると、関数宣言と関数定義は明確に別物です。しかし、JavaScriptでは関数宣言だけを行うことはできません。 この辺りは宣言だけを行えるC言語/C++を勉強するといいのではないかと思います。
お礼
回答ありがとうございました。 >正確には関数定義と関数宣言にあたる ・質問した時点では日本語がちょっと変かな、ぐらいにしか思わなかったのですが、言われてみれば確かに、書いた人の意図としてはそうなのかもしれない、と思いましたー
- gorusura
- ベストアンサー率59% (25/42)
関数宣言と言うと、普通はfunction文で関数定義をした場合のことを言います。 関数定義というのは、Functionコンストラクタ、function演算子、function文のいずれかで新たな関数を作成することを言います。 関数定義が、ソース要素であり、式の一部でない場合は、それはfunction文による関数宣言です。 そうでない場合は、それはfunction演算子による関数定義です。 ソース要素というのは、スクリプト全体又は関数内で、ネストしていない式です。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope 「関数定義の関数宣言」というのはすこしへんですね。 関数定義でもあり、関数宣言でもあります。 function文を使用しています。 難しいですね…… 上記URLを見ると分かると思います。 実際、関数定義と関数宣言は混同して使われている場合もあります。
お礼
回答ありがとうございましたー
お礼
回答ありがとうございました。 大変参考になりましたー