• ベストアンサー

謎の文法。。

いつもお世話になっております。 Javascriptの勉強をしていて、 (function (){})(); という構文にあたったのですが、これの意味が分かりません。 ちょっと実験した限りですが、alertするだけの機能を持たせて f = function (){alert("a");} f(); と、 (function(){alert("a");})(); は同じような挙動をしているように感じます。 ただ、前者はその後の処理で再利用可能なのに対し、後者は その場限りの実行になっている? だとすると、単純に alert("a"); とすれば良いじゃないかという話になるので、何か別の機能が あるんじゃないかと思うんですが、この構文について 解説をお願いできればと思います。

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

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

(function() { ... })(); という文ですが、まず一つ目の括弧の中で function() { ... } とあり、これは関数リテラルです。 つまり関数の定義を書いていることになります。 よって、一つ目の括弧を評価すると、関数への参照が得られます。 さらにその後ろに括弧があり、この括弧によって関数が実行されます。 guttten さんも仰っているように  f = function (){alert("a");}  f(); と、  (function(){alert("a");})(); はほとんど同じ動きになります。 で問題はここからで、alert 関数を使用するだけならば  alert("a"); と書けばいいのですが、色んな処理をしたい場合はそういうわけには行きません。 そこで、1 回しか使用しないが、関数形式で処理をまとめてしまいたい、という時に  (function() { .. .})(); という書き方が使われます。 中で条件分岐して関数を返すときなんかによく使われている気がします。 例) var myFunc = ( function() {  if ( condition ) {   return function() { .... };  } else {   return function() { .... };  } } )();

guttten
質問者

お礼

お礼が遅れてしまい大変申し訳ありません!! 非常に分かりやすい解説をありがとうございます。 意義も含めて理解できました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

f = function (){alert("a");} alert( window.f ); windowにfとういうごみがつく。 いっかこっきりなら、かんすうになまえもつけなくても というのでは?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • script要素をまたいだ関数定義と実行

    最近、javasriptを勉強しています。 わからない挙動があったので質問させてください。 htmlファイル内に、 <script type="text/javascript"> f(); function f(){ alert("hoge"); } </script> ↑これが動いて、 <script type="text/javascript"> f(); </script> <script type="text/javascript"> function f(){ alert("hoge"); } </script> ↑これが動かないのはどうしてなのでしょう? htmlの解析順序?の関係だと思うのですが、 詳しく解説しているページなどがあれば教えてください。

  • Javascriptで教えてください

    下記1だと実行できるのですが、2だと実行できないのはなぜでしょうか 1 <script type="text/javascript"> function OnButtonClick() { alert('クリック'); } $(function () { }) </script> 2 <script type="text/javascript"> $(function () { function OnButtonClick() { alert('クリック'); } }) </script>

  • ブックマークレットを使いたい

    エイサーの Chromebook 15 CB3- 532 F 14 のブラウザの Chrome からブックマークレットを使いたいと思っています。 javascript:alert('こんにちは'); や あやしいリンク先の実際のリンクを確認する javascript:(function(){var a=document.activeElement; alert(a.outerHTML);})(); は本を参考に試したところ実行できました。 同じように リンク先を確認してからジャンプする javascript: captureEvents(Event.CLIK); void( onclick=function(e){ return confirm(e. target. href) } ) では失敗しました。 失敗は計算機能 javascript:( function(){ var c=prompt(“計算式を入力してください”); if(c!=null){ alert(eval (c)); } void(0); } )(); でも起きました。 失敗で表示される画面は違うはずなのに結果として同じようです。 添付ファイルにその状態を示します。 両方とも市川市図書館のURL で試したのでその URL のトップが見える画面です。 直し方を教えてくださいよろしくお願いします

  • JavaScriptの記述について

    JavaScriptの以下のような記述を見たのですが、 functionを()();で囲むとどうして実行されるのか 理解ができません。文法的にどのように解釈したらよいでしょうか? (  function()  {   alert("HELO");  } )();

  • JavaScriptのグローバル変数

    JavaScriptのグローバル変数 次のプログラムで、(1)は p.obj1 = 32 と表示されるのに、 (2)はエラーになります。pはグローバル変数的にアクセスできる のに、なぜobj1がアクセスできないのかが分かりません。 詳しい方の解説をお願いします。 // test.js main(); function main() { F2(new F1(32, 100)); alert("p.obj1 = "+ p.obj1); // (1) alert("obj1 = "+ obj1); // (2) } function F1(obj1, obj2) { this.obj1 = obj1; this.obj2 = obj2; } function F2(p) { this.p =p; return this.p; } function alert(message) { WScript.Echo(message) }

  • 関数について。FireFoxで動作しません

    JavaScriptの関数について質問があります。 var makeFunc = function(){ return function(){ alert(); } } var a = makeFunc(); alert(typeof a);//function a();//FireFoxではエラー IEでは、aを関数として実行できるのですが、FireFoxでは エラーが出てしまいます。ちなみにIE、FireFox共にtypeof では"function"と表示されました。 エラーの原因と改善策を教えてください。よろしくお願いします。 FireFoxのエラー: uncaught exception:[Exception "Not enough arguments [nsIDOMWindowInternal.alert]"

  • function「文」と「演算子」の違い

    下記は、リンク先の分類でいくと、 「function 文」「function 演算子」 何れに該当するのでしょうか? var hoge = function f() { alert(1); }; hoge(); https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope ・無名関数でないから、「function 文」? ・あるいは、「var hoge = 」に入れているから、「function 演算子」? ・もしくは、「function 文」でもあり、「function 演算子」でもある? >同じ構文を持っています ・と書いているから、そもそも両者に違いはない?

  • オブジェクトとメソッドの、定義の分離

    JavaScriptにて、最初にメソッド用の関数を定義しておいた後、それを複数のオブジェクトのメソッドとして利用するようにしたいのですがうまくいきません。 *************************** <html> <head> <title>test</title> <script type="text/javascript"> function a() {return this.size;} function b(s) {this.size = s;} function rectA() { this.size = 0; this.getSize = a; this.setSize = b; this.notice = function() {alert(this.getSize());} } function rectB() { this.size = 0; this.arg = 90; this.getSize = a; this.setSize = b; this.notice = function() {alert(this.getSize());} } </script> </head> <body> <script type="text/javascript"> var a = new rectA; var b = new rectB; a.setSize(12); b.setSize(250); a.notice(); b.notice(); </script> </body> </html> ************************* 要するに↑のコードのようなことをやりたいのですが、FireFox3.6と12.1で実行した限りでは、a.notice()は実行されるものの, b.notice()の段階では「this.getSize is not a function」というエラーが出てしまいます。 上手な解決法がありましたらお願いします。

  • javascriptのクロージャが理解できずに苦しんでいます。

    javascriptのクロージャが理解できずに苦しんでいます。 下記のようなコードをよく見るのですが、a()とfuncA()()が等価のようなのですが 実行するとa()の場合のみ変数の値が維持されます。 a()とfuncA()()の違いを理解したいと思っています。 どなたかどうぞよろしくお願い致します。 またクロージャのわかりやすい解説サイトなどご存知の方いらっしゃいましたら 合わせてよろしくお願い致します。 function funcA() { var i = 10; return function() { i++; alert(i); }; }; var a = funcA(); console.log(a() === funcA()())//true funcA()();//11 funcA()();//11 funcA()();//11 a();//11 a();//12 a();//13

  • JS:関数の実行され方

    javascriptの関数の実行され方を教えてください。 知りたいのは以下のような時、上から順番に関数が実行されるが ある関数が完了しないうちにほかの関数の実行が始まるかどうかです。 hello1(); hello2(); hello3(); //---- function hello1(){ alert(hello); } function hello2(){ alert(hello); } function hello3(){ alert(hello); } 例えば上の例をそのまま実行すれば上から順番に実行されますが、 関数hello1が重たいループ処理をした場合 hello2とhello3はhello1が実行中に動いてしまいますか? ASでは動きませんでした。またphpも動かないみたいです。 また結果はブラウザによって変わるものなのでしょうか? ご教授ください。

このQ&Aのポイント
  • スーパーセキュリティーを購入しました。msedge.exeは無効な証明書を使用した接続を試みましたが、この接続は個人データを保護するためにブロックされました。
  • バナーを非表示にする方法を知りたいです。現在、スーパーセキュリティーを使用しているので安心しています。
  • ソースネクスト株式会社の製品・サービスに関しての質問です。
回答を見る