- ベストアンサー
javascript関数呼び出し時の()について
- javascript関数呼び出し時に、a関数があるとき、 a()をつけることで戻り値を代入するという意味になるということを教えて頂きました。また、()がないとき、aとした場合、関数の登録だけがされるということを教えて頂きました。
- しかし、以下のソースの場合、onclickには、関数名pushを[onclick="push"]ではなく、[onclick="push()"]と記述しないと正しく動作しませんでした。
- ()なしの、関数の登録だけがされるという内容を私は間違って捉えてしまっているのでしょうか。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No2です。 まずNo3について。 「関数aを呼び出す」「関数aを実行する」は同じで良いです。 おかしいのは、 >・関数自体を代入していますので、a関数を実行した戻り値を代入する の「関数自体を代入しています」の部分で、これは間違い。 「関数を実行した戻り値を代入する」は合ってます。 No2の補足について。 >document.onkeydown = push; は、キーがダウンした時に、push関数が定義され、ダウンしたときにpush関数が実行される。 document.onkeydownに、pushの関数自体(関数の定義内容)が代入され、キーダウンイベントが発生したら、document.onkeydown() が実行されます。 document.onkeydown = function(){ 処理内容; }; と書いたら、キーダウン時に、document.onkeydown()によって処理内容の文が実行されます。 ><input type="button" value="()ありボタン" onclick="push()"> これは、click時に、push関数が実行される。 はい。合ってます。
その他の回答 (6)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
>No.1お礼 >また、p=push; >で関数を定義し、 >p()で関数を実行するということでしょうか? どこまで勉強されたのかわかりませんが、 「言葉の定義」というのを、もうちょっと確認した方がいいと思います。 「このような作業をすることを○○と言う」というものです。 「関数を定義する」というのは、 function push(){ ・・・ } という命令を書くことです。 a=b というのは「代入」と言います。 a() というのは、No.3にも書いていますが、関数を実行することです。 自分勝手なルールを作らずに、言い方(名前)というのは決まっていますから自分で新しい名前をつけずに、 改めて参考書を読み直してみることをお勧めします。 そうすれば質問の内容も、今までの回答の内容も、すぐに理解できるようになると思います。
お礼
たびたびの情報ありがとうございます。 少し改めて資料等を見直したいと思います。 皆様のおかげで大体つかめてきました。 何度も情報ありがとうございました。
- pringlez
- ベストアンサー率36% (598/1630)
setTimeoutの書き方と似ていますね。 以下の2つは結果的に同じ動きをします。 ・setTimeout(hoge, 1000); ・setTimeout("hoge()", 1000); 第一引数に指定できるのは、関数オブジェクトか「スクリプトの文字列」です。後者は内部的には「hoge()」という文字列を関数オブジェクト化するために、以下のような変換を内部で行なっています。 setTimeout("hoge()", 1000); ↓ setTimeout(function() {hoge();}, 1000); ※細かいことを言えば毎回パースがおこるハズなので、文字列を指定したほうがほんの少し遅くなります。 HTML要素の属性に記述できるのは文字列のみです。ですので「<input type="button" onclick="hoge()">」と、「スクリプト文字列」を指定せざるを得ないのです。 文字列を代入しているだけで関数を代入しているわけではありません。ですので当然、以下のような変換が行なわれているはずです。 onclick = function() { hoge(); }; 少し考えれば分かると思いますが、どうしたってこうはなりません。 onclick = hoge; もし「onclick = hoge;」になるのだとするならば、以下のような値の時には 「<input type="button" onclick="document.getElementById('…').value = '…'">」 こうなってしまいますからね。 onclick = document.getElementById('…').value = '…'; chrome付属のデベロッパーツールなどで開いて確認すれば違いがよく分かると思います。 ※はっきり言ってこの辺は、多くの人がなんとなくいいかげんな理解で済ませていることが多い部分です。このようなことに疑問を持ち質問をし、きちんと理解しようとすることはとてもいいことだと思います。
お礼
情報ありがとうございます。 >※はっきり言ってこの辺は、多くの人がなんとなくいいかげんな理解で済ませていることが多い部分です。このようなことに疑問を持ち質問をし、きちんと理解しようとすることはとてもいいことだと思います。 そう言っていただけると頑張ろうという気になります。 ただ、もう少し自分で調べる力が付けばとも思うのですが…。 chrome等も入れてみて調べてみたいと思います。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
No.3です。 すみません、誤解してたのは私の方でした。 「a()」の説明ということですね。 ---------- ついでながらNo.1の補足。 <script> button2.onclick=push; </script> <input ・・・ onclick="button2.onclick=push;"> スクリプトとHTMLは別物です。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
No.2の表現に関して、 横からの質問で済みませんが、ちょっと気になったので。 function a(){ } a(); 「関数aを呼び出す」「関数aを実行する」 の2つの表現は同じ意味として考えていますが、これは違うのでしょうか。
- notnot
- ベストアンサー率47% (4900/10358)
>javascript関数呼び出し時に、 >a関数があるとき、a()をつけることで > >・戻り値を代入するという意味になるということ >・関数自体を代入していますので、a関数を実行した戻り値を代入する > >ということを教えて頂きました。 > >また、()がないとき、aとした場合、 >・関数の登録だけがされる ちょっと文章がおかしいです。aという関数が定義されているとして、 a だけ書くと、aという関数自体(関数の定義内容)の意味になります。 a() と書くと、aという関数を呼び出したその処理結果という意味になります。 本題に帰ると、 HTMLのonclick属性には、クリックしたときに呼び出したい関数自体を書くのではなく、クリックしたときに実行したいJavaScript文を書きます。関数を呼び出したいのなら()は必要です。
補足
情報ありがとうございます。 notnotさんの説明で、大体つかめてきたのですが document.onkeydown = push; は、 キーがダウンした時に、push関数が定義され、 ダウンしたときにpush関数が実行される。 <input type="button" value="()ありボタン" onclick="push()"> これは、click時に、push関数が実行される。 という解釈で間違ってないでしょうか?
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
HTMLとJavaScriptを別々に考えてください。 <input type="button" value="()ありボタン" onclick="・・・"> 属性値(" "で囲まれた部分)にスクリプトを記述します。(つまりonclick=の部分はHTMLです。) 単純に関数を実行するには <script> push(); </script> という書き方をしますので、 <input type="button" value="()ありボタン" onclick="push();"> という書き方になります。 --------------- <script> p=push; for(var i=0;i<10;i++){p();} </script> という書き方ができるように、 <input type="button" value="()ありボタン" onclick=" p=push; for(var i=0;i<10;i++){p();} "> こういう書き方もできます。 (できる、というだけで、読みづらくなるので一般的ではないです。)
補足
情報ありがとうございます。 (1)><script> >push(); ></script> >という書き方をしますので、 (2)><input type="button" value="()ありボタン" onclick="push();"> >という書き方になります。 つまり、(1)は、scriptタブ内で、push()と書くから、onclickも同じように()と記述する ということでしょうか? また、p=push; で関数を定義し、 p()で関数を実行するということでしょうか?
お礼
情報ありがとうございます。 かなりわかってきました。 <input type="button" value="()ありボタン" onclick="push()"> はHTML部分で、SCRIPTタグ部分の関数を呼び出すのに、()がいるのですね。 で SCRIPTタグ部分の document.onkeydown = push; は、push()で記述すると、 ほかの言語と同じように、実行され、しかも一度しか実行されないため document.onkeydown = push; このように記述するのですね。 情報ありがとうございます。