javascript に関する質問です。jquery のプラグインで、下記のように()で関数をかこっているのがあるのですが、この()はどんな意味なのでしょうか? javascript の解説のどこかにあると思うのですが、わかりやすい説明があったら教えてください。

(function($) {})

jquery そのものは、(function(){}) となっていました。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/11/10 15:07:39
  • 終了:2008/11/11 06:54:03

ベストアンサー

id:language_and_engineering No.2

lang_and_engine回答回数170ベストアンサー獲得回数632008/11/11 06:16:28

ポイント45pt

()自体がどういう意味を持っているのかについて,私も昔から疑問に思っておりました。


確かに()で関数をかこっているサンプルは山ほどあるのですが,

その事について明確に述べた情報源がどうしても見つかりませんでした。

「無名関数を()でくくれば後ろにもうひとつ()を付けて関数を呼び出せる」と書いてあるだけで,

どうしてそうなのかがわからなかったのです。


しかし,丸括弧の役割を具体例で推察する事はできます。


・無名関数の場合

	(function (x){ alert(x); })("hoge"); // これはOK

	function (x){ alert(x); }("hoge"); // NG

・jsonの場合


	eval("({x:1, y:2})") // OK

	eval("{x:1, y:2}") // NG
	

・Numberの場合


	(0).constructor.constructor("alert('Hello');"); // OK

	0.constructor.constructor("alert('Hello');"); // NG



しかし,


	var g = function (x){ alert(x); };
	alert( g );
	alert( (g) );
		// どちらも同じ結果になる

これは相違がありませんでした。



唯一,無名関数の周りの()について意味を付しているページがありました。

http://blog.phpbuero.de/?p=19

(a)

( function() { alert('x'); } )

In both cases the „(…)“ returns a handle to that function though.

(a)()

( function() { alert('x'); } )()

the first set of round brackets will return the handle to the function, on which you then execute „()“, which can simply be read as „call it now“.

無名関数を()でくくると,その関数への"handle"を返す,とあります。

(しかし「handle」がここでどういう意味で使われているのかは不明)


上記の例を含めて考えると,質問者様の注目している()は

「オブジェクトとしてすぐに呼び出せる形式にしますよ」という意思表示,と捉えて良いようです。



下記は以前に執筆した関連エントリーです。

JavaScriptの動かないコード (中級編) jsonオブジェクトをevalできないエラー

http://d.hatena.ne.jp/language_and_engineering/20081022/12245976...

id:isogaya

ありがとうございます。こういうことをきちんと説明してほしいですね。

2008/11/11 06:53:08

その他の回答(1件)

id:znz No.1

znz回答回数193ベストアンサー獲得回数252008/11/10 16:58:24

ポイント25pt

「(function($) {})」だけだと無名関数を生成するだけで何もしないので、普通はその後にその無名関数を呼び出す「()」や「(jQuery)」がついていると思います。

目的としては、他のローカル変数の名前空間の分離と、jQueryというオブジェクトを「function($) {}」の中では「$」という短いローカル変数名で使えるようにすることです。

http://kawa.at.webry.info/200701/article_12.html

http://allabout.co.jp/internet/javascript/closeup/CU20080415A/in...

id:isogaya

()で囲んでいるのは呼び出しをしているわけですね。

2008/11/10 17:11:19
id:language_and_engineering No.2

lang_and_engine回答回数170ベストアンサー獲得回数632008/11/11 06:16:28ここでベストアンサー

ポイント45pt

()自体がどういう意味を持っているのかについて,私も昔から疑問に思っておりました。


確かに()で関数をかこっているサンプルは山ほどあるのですが,

その事について明確に述べた情報源がどうしても見つかりませんでした。

「無名関数を()でくくれば後ろにもうひとつ()を付けて関数を呼び出せる」と書いてあるだけで,

どうしてそうなのかがわからなかったのです。


しかし,丸括弧の役割を具体例で推察する事はできます。


・無名関数の場合

	(function (x){ alert(x); })("hoge"); // これはOK

	function (x){ alert(x); }("hoge"); // NG

・jsonの場合


	eval("({x:1, y:2})") // OK

	eval("{x:1, y:2}") // NG
	

・Numberの場合


	(0).constructor.constructor("alert('Hello');"); // OK

	0.constructor.constructor("alert('Hello');"); // NG



しかし,


	var g = function (x){ alert(x); };
	alert( g );
	alert( (g) );
		// どちらも同じ結果になる

これは相違がありませんでした。



唯一,無名関数の周りの()について意味を付しているページがありました。

http://blog.phpbuero.de/?p=19

(a)

( function() { alert('x'); } )

In both cases the „(…)“ returns a handle to that function though.

(a)()

( function() { alert('x'); } )()

the first set of round brackets will return the handle to the function, on which you then execute „()“, which can simply be read as „call it now“.

無名関数を()でくくると,その関数への"handle"を返す,とあります。

(しかし「handle」がここでどういう意味で使われているのかは不明)


上記の例を含めて考えると,質問者様の注目している()は

「オブジェクトとしてすぐに呼び出せる形式にしますよ」という意思表示,と捉えて良いようです。



下記は以前に執筆した関連エントリーです。

JavaScriptの動かないコード (中級編) jsonオブジェクトをevalできないエラー

http://d.hatena.ne.jp/language_and_engineering/20081022/12245976...

id:isogaya

ありがとうございます。こういうことをきちんと説明してほしいですね。

2008/11/11 06:53:08
  • id:kn1967
    >"handle"を返す

    ハンドルは自動車や自転車の操縦するためのもの。
    ハンドルが無ければ操縦できない。ハンドルがあれば操縦できる。

    プログラムの世界では
    xx関数のハンドルを取得 = xx関数を操縦(利用)できるようになる。
    というような意味として捉えればOK。
  • id:language_and_engineering
    kn1967さん

    フォローありがとうございます。その通りだと思います。
    ファイルのハンドル,ウィンドウのハンドル,イベントのハンドルなどがありますね。

    ただしここでは,ECMA/DOM上でどういう裏付けを持って丸括弧を"handle"と言っているのか,気になるところです。
    (オブジェクトのハンドル?)

    質問内容にあるように, 「ハンドル」である旨がjavascript仕様のどこかに明記してあれば嬉しいのですが…。
  • id:kn1967
    ハンドルであると明記されている箇所があるわけではなくて
    ハンドルが取れる(=関数として使えるようになる)という意味で
    使っているだけだと思いますけど。

    文法的には ↓ が参考になるかと・・・
    O'Reilly JavaScript David Flanagan著 p188-
    http://books.google.co.jp/books?pg=PA188&lpg=PA188&dq=javascript+%22function+no+name%22&sig=z2cdHvBiiDxjsTutjf7Yg3BaHU8&ct=result&id=VOS6IlCsuU4C&as_brr=3&ots=wHOdFQ4xyW&output=html

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません