• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:無名関数を実行する場合について)

無名関数を実行する方法と注意点

Chaireの回答

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.4

JavaScript の文法を一通り眺めましたか? 関数にカッコ () を付けると「その場で関数を実行し、戻り値で置き換える」の意味になります。 この場合、 window.onload = init(); は init がその場で実行されて戻り値(なし=undefined)に変換され window.onload = undefined; となります。よほど運が良いのでない限り、これがうまくいくはずありません。 一方、 window.onload = init; と「実行しないで」セットした場合、load 発生時にブラウザが自動的に init を実行します。あるいは、適当な時点で window.onload() と手動で実行することもできます。 試行錯誤も結構ですが、一通り文法を眺めてからの方が効率が良いと思います。 -- なお、JavaScript の関数は無名だけでなく名前付きのものもあります。関数オブジェクトは名前付き関数の宣言、名前付き関数の式、無名関数の式に分類され、それぞれ特徴があります。まあ、いちいち「無名」関数を強調するのが変なのは同意です。 また、script 要素を head 要素内に書く必要もありません。むしろ、script 要素はブラウザの逐次描画を妨げますので、(@defer を付けないなら)読み込みの遅い外部スクリプトは文書末尾にまとめるべきですし、特定の要素の直前、直後に置いた方が良い場合もあります。 セミコロンに関しては、JavaScript では全ての文の末尾に必要です。ただ、特定の場合に省略できるというだけです。もし将来的にスクリプトの圧縮などを考えているのなら、付ける癖を着けた方が無難です。

persona
質問者

お礼

返事が遅れてしまい申し訳ありません。 アドバイスを頂き、感謝します。 まず忠告ありがとうございます。 もう一通りテキストは終わったのですが、仮にinit関数とした場合何故()を付けないのかはずっと疑問でした。 テキストにはさも当然のように書かれていたのでずっと理解できないまま終わって今いました。 回答者様のアドバイスでどうにか理解できた次第です。 ソースコードを書く際にファイルが初めからhead部分とbody部分に分かれて書かれていたのでそのまま鵜呑みにして書いてました。 これからは気をつけます。 それと、セミコロンは付けるようにします。 分かりやすいアドバイス本当にありがとうございました。

関連するQ&A

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • 無名関数内の変数のreturn

    function get_record(id,step,exefunc) { httpObj = new XMLHttpRequest(); ...XMLHttpRequest非同期通信  httpObj.onreadystatechange = function() { if(httpObj.readyState == 4) && (httpObj,status == 200) { data = httpObj.responseText; exefunc(data); }}} 上記関数でデータを1件取得します。 質問は2つあって、今はhttpObj.responseTextをexefunc関数の引数として渡して、responseTextを処理しています。 httpObj.responseTextをexefunc関数で処理するのではなくて、returnしたいのですが、どうすればよいかわかりません。無名関数の中にあるので、dataをreturnしても、外からは参照できないのです。 もう一つの問題は、get_record関数を呼び出す関数は2つあって、その2つを同時にwindow.onloadで実行したいのです。 get_recordでデータを取得、そのデータを表示するための関数disp1,disp2(表示場所が違うため2つにわけています)をwindow.loadで実行したいのですが、後に記述されたほうしか実行されません。 どうすれば2つがwindow.onloadで実行できるでしょうか。 足りない情報等あれば教えてください。 よろしくお願いします。

  • javascriptでonclickに複数関数を割

    javascriptでonclickに複数関数を割り当てる場合 HTML内であれば、 <button ... onClick="a1();a2();a3();"> でいけると思いますが javascriptにて function a1() { } function a2() { } window.onload = "a1;a2;" のような記述は駄目でした 一つであれば window.onload = a1; でOKですが javascriptでonclickなどに複数関数を割り当てる 書式を教えてください よろしく、お願いします

  • UserScriptで無名関数を書き換えることは出来ますか?

    setInterval()で自身を定期的に呼び出す関数があるとします。 その処理を止めたい場合、関数オブジェクトにnullを代入するか、もしくはclearInterval()を使うことで止めることができます。 しかし無名関数でなおかつTimerIDが指定されていない場合、この処理を止める方法はあるでしょうか。 UserScriptなのでページ内のスクリプトを全て実行した後で動作するものとします。 無名関数を書き換えることが出来れば解決しそうなのですが・・・

  • なぜ関数をfuncで呼び出すのか。なぜfunc()ではいけないのか。

    画像の読み込み完了をトリガーとして動作する以下のような関数があります。 var img = new Image(); window.onload = function() { img.onload = func; } function func() { (省略) } img.onloadによって、画像の読み込みが完了したときに動作する関数を指定していますが、なぜfuncと書き、func()ではいけないのでしょうか?実際に試してみましたが、()をつけると動作しませんでした。()をつけないで関数を呼び出す方法を知らなかったので(無名関数を使う場合でさえ、変数名()という形を取るのに)、この理由が分からなくて困っています。どなたか教えてください。

  • window.onloadイベントの任意実行はできませんか?

    ajaxによる画面項目切り替えを行っていますが、 その場合、window.onloadイベントが発生しないようです。 ユーザからの命令でwindow.onloadイベントを発生させることは不可能でしょうか?

  • window.onload=の関数呼出で()が不要

    window.onload=の関数呼び出しで()が不要なのはどうしてでしょうか? ・windowオブジェクトのonloadイベントハンドラだから? ・例えば、imageオブジェクトだったらどうなるでしょうか? hoge = new Image(); hogeに対して何か処理; hoge.onload = kansu; or hoge.onload = kansu(); http://www5e.biglobe.ne.jp/~purest/javascript/zakki/onload.html

  • イベントの関数について、よくわからないことがあります。

    イベントの関数について、よくわからないことがあります。 (1)引数をセットしない関数と window.document.onmousemove = f; function f(evt) { alert(evt); } (2)無名関数?に引数 window.document.onmousemove = function(e) { alert(e); } (1)(2)は同じ動作なのですが、window.document.onmousemoveにセットする関数の引数は 特殊なのでしょうか?

  • window.onloadに関数を指定したいです。

    window.onloadに関数を指定したいです。 以下のfoge関数をwindow.onloadに入れる場合は、どうすればいいのでしょうか? function test(){ this.foge = function(){ } } 以下のような感じで、fogeを指定したいのですが。 window.onload=function(){test()} function test(){ } どうすればいいのでしょうか? よろしくお願いします。

  • evtとは

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>イベント情報の取得</title> </head> <body> <script type="text/javascript"> <!-- // ページのロード時に呼び出される関数initをセット window.onload=init; // ページのロード時に呼び出される関数 function init(){ // onclickイベントハンドラを定義 document.getElementById("txt").onclick=msg; } // onclickイベントハンドラ関数 function msg(evt){ // W3C DOMとIEの両方のイベントオブジェクトに対応 evt = (evt) ? evt : ((event) ? event : null); alert(evt.type+"されました"); } //--> </script> <div id="txt">クリックしてください</div> </body> </html> 上記のコードで【MozillaやOperaなどのブラウザでは、イベントハンドラ関数を設定した場合にも、関数の引数としてイベントオブジェクトが渡される】とのことですが、イベントハンドラ関数msgに渡されているevt【function msg(evt){】はいきなり出て、何を意味しているのかよくわかりません。 このコードを見て推測できる方、アドバイスをお願い致します。