質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

17592閲覧

【jQuery】関数名にカッコがない呼び出し方は何?

k499778

総合スコア599

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

3クリップ

投稿2016/03/27 15:54

現在jQueryを使ってプログラムを作っていました。
ちなみに以下のリンクを見ていました。
http://semooh.jp/jquery/api/ajax/serialize/+/

ここでshowValuesメソッドを呼び出す際、「カッコなし」で呼び出していますが、
この文法はまだ私はなじみがありません。
普段はfunctionを使ってその中で「カッコあり」の関数名で呼び出します。

この「カッコなし」の関数の呼び出し方は何でしょうか?どういった文法でしょうか?
もし参考になるサイトがあれば教えていただきたいです。

調べ方が難しくなかなかヒットしないためお力を借りたいと思います。
お願いします。

javascript

1$("form").change(function(){ //いつもはこの書き方。括弧あり。 2 showValues() 3});

javascript

1$("form").change(showValues); //今回の書き方。括弧なし。この書き方知らない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

JavaScript コールバック とかで検索するとわかるかと思います。

JavaScript

1$("form").change(function(){ //いつもはこの書き方。括弧あり。 2 showValues() 3});

JavaScript

1$("form").change(cb); 2 3function cb(){ 4 showValues(); 5}

と同義なのはわかりますか。

投稿2016/03/27 16:04

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/03/28 00:23 編集

回答ありがとうございます。 リンク先わかりやすかったです。 ・javascriptだと関数もオブジェクトなので、引数として指定できる。 ・今回の「カッコなし」はいわゆるコールバック関数で、このよう書き方をし、処理の最後にコールバック関数が実行される。 ・「カッコがある」とその場で実行されてしまう。 ・「カッコあり」は実際その場で関数を実行する書き方 といった感じでしょうか? 「コールバック関数」か「実際に関数を呼び出している」かの違いなのかなあと勉強して思いました。 呼んでいる関数は同じだけど、呼び出し方が違うと。 いろいろ勉強になりました。 ありがとうございます!
kaz.Suenaga

2016/03/28 00:49 編集

「呼んでいる関数は同じだけど、呼び出し方が違うと。」 動作としてはそうなんですが、 .change(cb) としている際は「呼び出している」のではなく、「changeという関数を呼び出す、その際の引数はコールバック関数(オブジェクト)」と理解するのがいいです。 引数なのであって、その時点では呼び出されていません。 change()関数の中でどこかでその引数を実行する箇所があった際に初めてよびだされます。
guest

0

javascript

1$("form").change(showValues);

において、change() に渡しているのは関数オブジェクトです。

javascript

1function add2(x) { 2 return x + 2; 3}

という整数を引数にとる関数があったとして、

javascript

1console.log(add2(3)); // (1) add2() にリテラルの整数を渡す 2var y = 3; 3console.log(add2(y)); // (2) add2() に変数に入った整数を渡す

のように、「整数リテラル」あるいは「変数に入った整数」で実引数を渡せますが、関数を引数にとるような関数でも同じようなことができます。

javascript

1function execTwice(func) { 2 console.log([func(1), func(2)]; 3}

てな感じの関数があったとして、

javascript

1execTwice(function(x) { return x * 2; }); // (1) execTwice() にリテラルの関数を渡す 2var sub2 = function(x) { return x - 2; }; 3execTwice(sub2); // (2) execTwice() に変数に入った関数を渡す

というように「関数リテラル」あるいは「変数に入った関数」を、実引数として関数 (execTwice) に渡せます。
また、関数の場合は、先の add2() のようにfunction文で定義した関数を名前で渡すことができます (sub2 の方はfunction式 で定義)。

javascript

1execTwice(add2); // (3) execTwice() に function 文で定義した関数を渡す

ご質問に戻りますと、change() に渡している showValues は、「function文で生成された関数オブジェクトが代入された変数」か「function 式で定義された関数名」かのいずれかです。

誤解されているかもしれないので念のため付け加えておきますが、ご質問に書かれていた「カッコあり」の方も、change() に渡しているものは関数呼び出しではありません。関数の定義です。関数の呼び出しは通常、関数オブジェクトの後ろに () をつけて呼び出すものです。(showValues() は関数の呼び出し


2016-04-27 追記
「function 文」という用語は正しくなく、「関数宣言」とすべき、とのご指摘をいただきました。
「function 式」の方もあわせて「関数式」と置き換えるとよさそうです。
詳しくは、関数と変数の巻き上げの違いとは - teratail に対する私の回答への think49 さんのコメントをご覧ください。

投稿2016/03/27 16:18

編集2016/04/26 23:31
unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/03/28 00:23

回答ありがとうございます。 詳しく具体的に説明していただき感謝しています。 >ご質問に書かれていた「カッコあり」の方も、関数呼び出しではありません。関数の定義です。関数の呼び出しは通常、関数オブジェクトの後ろに () をつけて呼び出すものです。 「カッコあり」の方は「showValues()」と関数オブジェクトの後ろに括弧があるので、関数呼び出しではないのでしょうか? 少しそこだけ疑問に思いました。 ただ色々と教えていただきありがとうございます。
kaz.Suenaga

2016/03/28 00:45

おじゃまします。 こちらの説明の方が詳しいのでこちらにつけます。 「カッコあり」の方については「無名関数」を調べてみるといいですよ。その場一度限りで使う関数オブジェクトを名前を省略しながらその場で定義し、コールバックとして渡している、というものです。 カッコがないのは呼び出しでない、というのもそうですが、どちらかというと「引数としてオブジェクトを渡す」という考えによるものと理解した方がいいと思います。
unau

2016/03/28 00:59

「カッコあり」、「カッコなし」と書かれていたのは、showValues にカッコがついているかいないか、ということだったのですね 私が言いたかったのは、change() に渡しているものはいずれも「関数」であり、「関数を呼び出したもの」ではない、ということです。change() の中でいつ実行されるかはわかりません。最後とは限りませんし、私の示した execTwice() のように複数回実行されるかもしれません。
unau

2016/03/28 01:06

回答の方に追記&修正しておきました。
unau

2016/04/26 23:32

別の質問において、「function 文」というのは正しい用語じゃないよ、というご指摘をいただきましたので、回答に追記しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問