• ベストアンサー

関数の呼び出しかた

こんばんは。 最近javascriptを始めたのですが一つどうしても 分からない事があり質問させて頂きました。 ユーザー関数の呼び出しの方法なのですが、 入門書で勉強中に関数の呼び出しは、たとえば msgtest関数を定義していたとして  msgtest(); として呼び出すのが基本だと考えたのですが ウィンドウを常に前面に出すサンプルスクリプト 中、window.onblur = msgtest; という風に引数のカッコなしで呼び出しており、 カッコをつけると動作しないという事が 起こりました。理由がわからず困っています。 何故この際引数のカッコをつけてはいけないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

JavaScriptは詳しくないので、はずしているかもしれませんが、 Cなんかでも同様の記述があるので・・ 通常関数を呼び出す(実行する)場合は、 関数名+括弧+引数の記述になります。(質問内容の前半の通り) で、括弧なしでの記述は、関数をそのとき実行するのではなく、 「関数そのもの」を何かに渡すために書いたりします。 (C言語でいえば、関数ポインタ) つまり質問の例では、window.onblurというイベントにイベント発生時の処理関数として、 msgtest関数を登録しているはずです。(イベントハンドラ) この場合、msgtest関数が実行されるのは、登録時ではなく、このイベントが発生したときです。 一方 window.onblur = msgtest() の場合は、msgtest関数の実行結果(関数の戻り値)をイベントハンドラとして登録しようとします。 これも一概にエラーという訳ではないですが、msgtest関数の戻り値がなにかの「関数そのもの」でないと、 どこかでエラーになります。 (凝ったプログラムではこう記述する場合もあるでしょう)

riruriruriru
質問者

お礼

なるほど!イメージ的に理解できました。 ありがとうございます。 またお願いいたします。

その他の回答 (1)

  • Seiryo
  • ベストアンサー率13% (27/203)
回答No.1

文法上の理由からだとおもいますけど・・ vrrdoeie?

関連するQ&A

  • 関数を呼び出す関数

    Javascriptを勉強し始めたばかりの者です。 やりたいことを実現するうまい方法が見つからなくて困っています。 例えば、以下のように複数の関数があらかじめあって、 sample1() sample2() sample3() ・ ・ sample20() これらをまとめて実行する function all() といった関数を作りたいと思っています。 function all()の中にそれぞれ羅列すれば実現できる?のですが (例) <script type="text/javascript"> <!-- function sample1(){ なんらかの処理1 } function sample2(){ なんらかの処理2 } ・ ・ ・ //前述関数をまとめて実行する関数 function all(){ sample1(); sample2(); sample3(); ・ ・ sample20(); } //--> </script> もっとうまいやり方はないものでしょうか?羅列するというのはどうも・・・。 どうしてこのような事をしたいのかというと、sample1()、sample2()などはそれぞれ独立していて関連しあっていません。 単体で動かしたいときもあれば、まとめて全部実行したいという場合もあってこのようなことを考えています。 どなたかご教授願えたら幸いです。どうぞよろしくお願いします。

  • 動的にイベントハンドラ生成する際に引数がある関数を作る

    お世話になっています、ご質問があります。 以下の場合 --hogeA.html-- <html> <head> <script type="text/javascript" src="./**/hogeB.js"></script> </head> <body onload="javascript:hoge.init()"> <input type="text" name="hogehoge" value=""> </dody> </html> --hogeB.js-- hoge = { init : function(){ var BodyElement = document.getElementsByTagName('INPUT'); BodyElement.onBlur = this.setOnBlurAction; }, setOnBlurAction : function(value){ ****(省略)**** } } 上記の場合に、onBlurイベントハンドラ関数を生成し、 画面上でonBlurイベント時にsetOnBlurActionを実行させる予定です。 引数のある関数の場合、動的にイベントハンドラ関数を生成する際はBodyElement.onBlur = this.setOnBlurAction; では駄目な気が致しますが、どうすれば良いでしょうか。 どなたかご教授願います。

  • c言語の関数定義について

    次の関数定義を考える. int f(int x) {if (x > 0) {return x * f(x-1);} else {return 1;} } この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ.ただし,オーバーフロー(overflow) については考慮しなくてよい. ”この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ”って理解できません、どのように定義したいいか、ご教授お願いします。

  • コーディングの綺麗な、サンプル。(長文

    コード、スクリプトの書き方で悩んでいます。 具体的には、 ユーザー関数内への、変数の渡し方です。 ・変数でユーザー関数に引き渡すか、 ・定数にして、読み出すか、 ・いっその事、グローバル変数にするか。 私は、よくミスをする人間と自覚しているので、 グローバル変数を使わない書き方にしているんですが。 (未定義のグローバル変数は、やはり危険だと思う。 けど、作成環境では未定義の変数は、意図的に Notice: Undefined variableの注意を出して、つぶす ようにしてるから、未定義はあり得ないし。^^;) 定数は便利なんですが、スクリプト中に$のない変数 があるのが違和感があるし、定数を使ってもそのまま 定数名が現れてしまう場合もあるので、$teisu = TEISU; としないといけないのが、かっこわるいかなー、と。 (明示的に定数を表示する方法もあるのかな?) 引き渡す方法も、ユーザー関数内から、ユーザー関数を 呼び出すと、引数のはしごになってしまうし、()内に 4、5個もあると、かっこわるいかなー、と。^^;;; まとめられる物は、まとめているんですが、。 (組み立て方も、悪いんだと思いますが。) この辺の臨機応変な使い方が、よく分からなくって。^^; 意見は分かれると思いますが、綺麗なコーディングって、 どんなものですか? 実際にPHPの掲示板等で、これは綺麗だよ。 または、綺麗なコーディングをするための、初心者に 毛が生えた程度の、わかりやすいHPもありましたら 教えてください。 私なりのかっこよさは、 グローバル変数は使わない。 ユーザー関数の引き渡しは、少ない。 未定義の変数は、使わない。 なんですが、探してもグローバルを多様しているものや 未定義の変数の注意がたくさん出るものばかりで。 それとも、私なりのかっこよさは、ずれているんでしょうか? 長くなりましたが、お願いします。

    • ベストアンサー
    • PHP
  • 手続き型と関数型について。

    手続き型言語の定義は、「記述された命令を逐次的に実行し、処理の結果に応じて変数の内容を変化させていくプログラミング言語」となっていて、関数型言語の定義は、「数学的な言語仕様をもつプログラミング言語のこと。一度値を与えられた変数は常にその値を維持し、計算は計算結果を引数とした関数呼び出しの繰り返しとして行われる。」とあります。 関数型の、「一度値を与えられた変数は常にその値を維持し」はどういう意味ですか? 例えば、a=2とした後に、a=3などとすればaの値は変わっているのですが。 簡単な例で説明してください。

  • 引数なしの関数で疑問です

    とほほのjavascriptで勉強しています。 http://www.tohoho-web.com/js/function.htm#objFunction ここの function goukei() { var ans = 0; for (i = 0; i < goukei.arguments.length; i++) { ans += goukei.arguments[i]; } return(ans); } sum = goukei(1, 2, 3, 4, 5); goukei関数を定義したときの引数は、なしなのに goukei関数を呼び出すとき、goukei(1, 2, 3, 4, 5)と、このように5つも引数を指定しています。 Javaでは、こんな呼び出し方をすれば、コンパイルエラーになりますよね。 javascriptでは、引数なしで関数を宣言しても、呼び出すときに、好きな個数の引数を渡せるのですか? 「javascript 引数 省略」とか、「javascript 引数なし」とかいろいろググッてみたのですが 肝心の、javascriptでは引数なしにして宣言しても、呼び出すとき、好きな個数の引数つけて呼び出しても大丈夫。みたいな、確認したい記述はみつかりませんでした。 javascriptでは、このような書き方もできるということでしょうか。

  • VBAの中でユーザー定義関数を使うときに

    VBAの中でユーザー定義関数を引数に変数を持たせて使いたいのですが、変数をうまく認識してくれません。 VBAの中でユーザー定義関数を使うにはどうしたらいいのでしょうか? よろしくお願いします。

  • 関数の引数と型

    関数の引数と型 TextBoxに数字しか入力できないようにする関数として Private Function fTextBoxNumberCheck(Byval MyTextBox as TextBoX)As Boolean という宣言文を目にしました。 Q1. Byval MyTextBox これは関数の呼び出し側では実引数としてText1,Text2のようなオブジェクト自体を 渡すことができるということでしょうか? 私の読んでいる入門書では実引数は変数ばかりなので・・・。 Q2. as TextBox これは入門書によれば実引数のデータ型となっていますが 調べてもTextBoxという型はありませんでした。 宣言文は関数のサンプルとして、その前後は記載されていませんでしたが、 どこかにTextBoxの宣言をしてあるはず(?)なのでしょうか? Yesとすればどのように書くのでしょうか?

  • クラスの関数へユーザー定義型の引数を渡す(VB6.0)

    お世話になります。 クラスモジュール内へ宣言した関数へユーザー定義型(標準モジュール内でPublicで宣言)の引数を渡すとコンパイルエラーとなってしまいます。 ユーザー定義型を宣言した以外の標準モジュールでは同じ関数は動きますが、Formモジュールでは動きません。 標準モジュールにしかユーザー定義型の引数を渡すことは出来ないのでしょうか??

  • JavaScript と VBScript を同時に使う

    メタ内に VBScript, JavaScript の順にスクリプトを配置しているのですが,ボディ内から JavaScript の関数を引数つきで呼び出そうとすると,「Sub プロシージャを呼び出すときに,かっこを使うことはできません。」と表示されエラーになります。 どうすればいいでしょうか。よろしくお願いします。