タイトル通りFunctionとfunction Function(){};は一体何が違うのでしょうか?
javascript
1console.log(Function, function Function(){});
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
何だか重要なことが書かれていないので,補足しておきます。
・function文
もっとも一般的な関数定義です。functionというキーワードを用いたfunction文を使用することによって定義します。「文」とはJavaScriptに何か動作をさせるものです。後述する「式」は(副作用を除けば)基本的にそれ自体は何もしません。
function plus(x, y) {
return x+y;
}
・関数リテラル(関数式ともいう)
「式」として関数を定義するもの。「式」とはJavaScriptインタプリタが評価して値を生成できるものです。リテラルも式の一種です。リテラル式の値は、そのリテラルが表す値と同じです。リテラルには数値(100)や文字列("hoge")のような当たり前のものから,論理値(true)やオプジェクト({x:2})や配列([1,2])や正規表現(/foge/)のようなものまであります。
関数リテラルは関数定義をリテラル(式)として記述できるものです。リテラルなので,JavaScriptの式の中に記述することができます。関数リテラルもfunctionというキーワードを使用します。
function文との違いは,function文は「文」なので関数名が必要なのに対し,関数リテラルは「式」なので関数名が不要です(ただし書式上は関数名を記述しても構わない。そのため再帰関数も作れる)。
var plus = function(x, y){ return x+y; };
・Function()コンストラクタ
組み込みの関数コンストラクタです。new演算子を使用して "文字列" から関数を定義することができます。そのため,Function()コンストラクタを使用すると,実行時に動的に生成してコンパイルできます。また,Function()コンストラクタは生成した関数に名前をつけることはできません。常に匿名関数を生成します。
ただし,使い方が難しかったり,効率が悪いのであまり使用されません。Function()コンストラクタを使用するたびに関数本体が解釈されて新しい関数オブジェクトが生成されるので,頻繁に呼び出されると実行の効率が非常に悪くなります。
var plus = new Function("x", "y", "return x+y;");
さて,ここまで書いておいて,次に違いを述べます。
まずfunction文と関数リテラルの違いですが,定義する場所と使用できる(呼び出せる)箇所の条件が違います。以下のコードを見てください。
var result_plus = plus(1, 4);
//var result_sub = sub(5, 2);
var sub = function(x, y){ return x-y; };
var result_sub = sub(5, 2);
function plus(x, y) {
return x+y;
}
まず,function文はif文やwhile文の中で使用することはできません。関数の中で関数を定義する所謂入れ子型の関数の場合でも入れ子にする関数のトップレベルで定義しなければなりません。
それに対し,関数リテラルは式なので,式が書ける場所ならどこでも使用できます。したがってif文の中や,while文の中でも使用できます。
そして,上記のコードのコメント部分を外すとエラーとなります。JavaScriptのコードは上から順に実行されていくため,コメント部分が実行されるとき,変数subにはまだ何も代入されていません。そのため,関数呼び出しとして使用するとエラーとなるのです。
しかし,plus関数はfunction文によって一番下で定義されているのにもかかわらず,一番上の関数呼び出しはエラーとなりません。これによってfunction文は定義する箇所と呼び出す箇所は関係なく使用できることがわかります。
続いてFunction()コンストラクタで生成される関数とそれ以外の関数との違いですが,スコープの違いがあります。以下のコードを見てください。
var hoge = "global";
function createFunc() {
var hoge = "local";
return new Function("return hoge;");
}
alert(createFunc()()); // show "global"
上記のコードを実行すると何が表示されるかというと,「global」が表示されます。関数のスコープを知っている人なら,ここで「おや?」と思うはずです。本来ならグローバル変数であるcreateFunc()の外側のhogeは,ローカル変数であるcreateFunc()内のhogeに隠蔽されて,createFunc()によって生成される関数はローカル変数のhogeを参照すると考えます。事実,Function()コンストラクタで関数を生成する部分を関数リテラルに置き換えると上記のコードは「local」を表示します。しかし,Function()コンストラクタで関数を生成する場合は違います。Function()コンストラクタが生成する関数は所謂静的スコープを使用しません。常にトップレベルの関数としてコンパイルされるのです。
最後に,関数リテラル(関数式)で使用されるfunctionキーワードが演算子かどうかなんですが,
私は演算子ではないと考えています。例えば,演算子でよく話題にでるのが優先順位ですが,この優先順位を示す表にfunctionキーワードが列挙されているところを見たことがありません。下記のページでもfunctionキーワードについては言及されていません。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators#Operator_precedence
以下のページは翻訳ミスなのではないかと思っています。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/function
「式と演算子」という章に式と演算子が混ざって説明されているため,翻訳した人がfunctionキーワードを演算子と勘違いしたのではないかと(しかもURLがReference/Operators/functionだし)。その証拠に上記のページの英語版(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function)を見てみると,説明として「The function keyword can be used to define a function inside an expression.」とあり,どこにも演算子(function operators)という記述は見当たりません。
また,上位のページ(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators)を見てみると,「式と演算子(カテゴリ別)」となっており,functionキーワードは「基本式」に含まれています。
以下のECMAScript仕様書も読んでみましたが,function operatorsという項目は見つかりませんでした。
以上より,私は関数リテラル(関数式)で使用されるfunctionキーワードは演算子ではないと考えています。
投稿2016/04/09 12:52
総合スコア28
0
Functionはオブジェクト。
functionは無名関数を定義する式の演算子、または、関数宣言を行う文のキーワードです。
javascript
1// オブジェクト 2var f = new Function('return'); 3 4// 式 5var f = function() {}; 6var o = {f:function f() {}}; 7 8// 文 9function f() {}
投稿2016/03/08 21:19
総合スコア105
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/09 16:40 編集
0
ベストアンサー
Function
は built-in object ですが、function Function(){}
は通常のユーザ定義関数です。
Re: SmithTarou さん
投稿2016/03/08 19:15
総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/09 14:01
2016/04/10 07:59