javascriptの文法

[新着] Webテンプレートを仮オープンしました



0   名前: mukoubuti : 2006/12/12(火) 09:29  ID:rKNcFn1i
functionを入れ子にして最後に();をつけている文法がよくわかりません。
ブックマークレットなんですがどういった意図でこのようにしているのかを知りたいです。
ご存知の方がいらっしゃいましたら教えていただけるとありがたいです。よろしくお願いします。
javascript:(function(){m='http://mail.google.com/mail/?view=cm&fs=1&tf=1&su='+encodeURIComponent(' ')+'&to='+encodeURIComponent('example@example.com');w=window.open(m,'addwindow','status=no,toolbar=no,width=575,height=545,resizable=yes');setTimeout(function(){w.focus();},50);})();

1   名前: 元帥 : 2006/12/12(火) 09:29  [URL]  ID:w7tbH5Ra
ものは試し
<a href="javascript:(function(){alert();})();">アラート表示</a>
<a href="javascript:(function(){alert();})">エラー</a>


> 関数を実行するためには、その関数オブジェクトを参照している変数に括弧をつけることで、実行する事ができます
http://codezine.jp/a/article.aspx?aid=221

2   名前: NullPo : 2006/12/12(火) 09:29  ID:Z0FHbpib
前から不思議に思っていたのだけど、
(function(){})()の形でないと動かないのは何故なんですかね。

えぇと、つまり、
  //動作
  (function(){alert();})();
  //動作
  var a = function(){alert();}();
  //エラー
  function(){alert();}();

この、最後のが動かないのは何故なんですかね。

3   名前: くりまんじゅう  : 2006/12/12(火) 09:29  ID:G670zJOg
そりゃ、メソッドであって変数でないからでしょ。
(私としてはcodezineの書き方には異論があるけれども)

4   名前: 匿名 : 2006/12/12(火) 09:29  ID:x6qel7Bl
>>0
> どういった意図で

・ページ内スクリプトに干渉しないようスコープを制限する。
・戻り値として undefined を返すことでページの移動を防ぐ[*1]。

だが、>>0 は変数が var 宣言されておらずにグローバル変数になっているので、ページ内スクリプトに干渉する恐れあり。


>>2
式文(ExpressionStatement)は、「{」と「function」以外で始まらねばならない[*2]。

・3 番目は「function」で始まる文ゆえ、関数宣言(FunctionDeclaration)と見なされる。関数宣言による関数オブジェクト生成は実行コンテキスト開始時に行われるため、同時にそれを呼び出すことはできない(と言うか Syntax Error)。

・1 番目は、括弧で括ることにより、関数宣言ではなく関数式(FunctionExpression)と見なされる。関数式はその場で評価されて関数オブジェクトを返すため、同時にそれを呼び出すことができる。
・2 番目は、変数文(VariableStatement)の右辺ゆえ、関数式でしかありえない。

----
[*1] http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/reference/location.html#1193258
[*2] http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/ecma262r3/12_Statements.html#section-12.4

5   名前: NullPo : 2006/12/12(火) 09:29  ID:Z0FHbpib
>>4
なるほど!
よくわかりました。
詳しいご説明ありがとうございます。

6   名前: mukoubuti : 2006/12/12(火) 09:29  ID:UsbAxSiO
>>4
式文(ExpressionStatement)は、「{」と「function」以外で始まらねばならない[*2]。
っていうので納得がいきました。ありがとうございました。

一覧へ戻る