質問: 現在jQueryを使ってプログラムを作っていました。 ちなみに以下のリンクを見ていました。 ここでshowValuesメソッドを呼び出す際、「カッコなし」で呼び出していますが、 この文法はまだ私はなじみがありません。 普段はfunctionを使ってその中で「カッコあり」の関数名で呼び出します。 **この「カッコなし」の関数の呼び出し方は何でしょうか?どういった文法でしょうか? もし参考になるサイトがあれば教えていただきたいです。** 調べ方が難しくなかなかヒットしないためお力を借りたいと思います。 お願いします。 ``` $("form").change(function(){ //いつもはこの書き方。括弧あり。 showValues() }); ``` ``` $("form").change(showValues); //今回の書き方。括弧なし。この書き方知らない ```
回答: ``` $("form").change(showValues); ``` において、`change()` に渡しているのは関数オブジェクトです。 ``` function add2(x) { return x + 2; } ``` という整数を引数にとる関数があったとして、 ``` console.log(add2(3)); // (1) add2() にリテラルの整数を渡す var y = 3; console.log(add2(y)); // (2) add2() に変数に入った整数を渡す ``` のように、「整数リテラル」あるいは「変数に入った整数」で実引数を渡せますが、関数を引数にとるような関数でも同じようなことができます。 ``` function execTwice(func) { console.log([func(1), func(2)]; } ``` てな感じの関数があったとして、 ``` execTwice(function(x) { return x * 2; }); // (1) execTwice() にリテラルの関数を渡す var sub2 = function(x) { return x - 2; }; execTwice(sub2); // (2) execTwice() に変数に入った関数を渡す ``` というように「関数リテラル」あるいは「変数に入った関数」を、実引数として関数 (`execTwice`) に渡せます。 また、関数の場合は、先の `add2()` のように**function文**で定義した関数を名前で渡すことができます (`sub2` の方は**function式** で定義)。 ``` execTwice(add2); // (3) execTwice() に function 文で定義した関数を渡す ``` ご質問に戻りますと、`change()` に渡している `showValues` は、「function文で生成された関数オブジェクトが代入された変数」か「function 式で定義された関数名」かのいずれかです。 誤解されているかもしれないので念のため付け加えておきますが、ご質問に書かれていた「カッコあり」の方も、**change() に渡しているものは**関数呼び出しではありません。関数の定義です。関数の呼び出しは通常、関数オブジェクトの後ろに `()` をつけて呼び出すものです。(**showValues() は関数の呼び出し**) 2016-04-27 追記 「function 文」という用語は正しくなく、「関数宣言」とすべき、とのご指摘をいただきました。 「function 式」の方もあわせて「関数式」と置き換えるとよさそうです。 詳しくは、関数と変数の巻き上げの違いとは - teratail に対する私の回答への think49 さんのコメントをご覧ください。