JavaScriptのFunction
「new Function("clickHandler(event);")」というのは、"clickHandler(event);"という文字列をプロパティの値に持つFunctionオブジェクト
A Better Project@はてなダイアリー - setAttribute メソッドを使用したとき、IEでは簡単にイベントハンドラを設定できない話
上記表現はちょっと微妙かも?と思い、JavaScriptのFunctionについて調べてみたことを補足します。
普通によくみるFunctionの定義方法は以下。
function myfunc(){ alert("sample"); };
この書き方は以下のような冗長な形でも書くことができます。つまり、上記の書き方は下記の書き方の省略形です(参考:JavaScript: A Survey of the Language)。
var myfunc = function myfunc(){ alert("sample"); };
次のような書き方もできます(昨日のエントリのsample3と同じ)。この場合、変数myfuncに名前の無いFunction定義を代入するという形になりますが、「myfunc()」で定義したFunctionを実行することができます。
var myfunc = function(){ alert("sample"); };
次のような書き方も可能です。この場合も「myfunc()」で「Function myfunc2」を実行できますが、外から直接「myfunc2()」で「Function myfunc2」を実行できるのはIEのみです。
var myfunc = function myfunc2(){ alert("sample"); };
冒頭に挙げた書き方をすると、以下のようになります。プロパティの値というより、Functionの処理と説明すべきでした。
var myfunc = new Function('alert("sample")');
new演算子を使ったFunctionの定義については、Core JavaScript 1.5 Reference:Functions - MDCに説明があります。「new Function ([arg1[, arg2[, ... argN]],] functionBody)」という形で引数も指定することが可能です。
今まで挙げてきたいずれかの方法で、Functionの定義をした場合、以下のように使用することができます。Functionとして実行した場合は全て同じですが、変数として代入(という表現も微妙ですが。()をつけずに、Function名を指定した場合)した場合は、定義の方法、ブラウザにより、得られる値が微妙に異なります。
//「var myfunc =」 をつけても得られる値は同じ。 function myfunc(x,y){ return x + y; }; //変数myresultには、 //Functionの戻り値が代入される。 var myresult1 = myfunc(2,1);//=>3 //変数myresult2には、 //Fucntionの定義そのものが代入される。 var myresult2 = myfunc; //Firefox(alertでの出力結果。以下同様。) //=>function myfunc(x,y){ // return x + y; // } //IE //(ctrl + cでコピーして、ペーストした結果。 //[TAB]を入れるときちんとTAB文字も出力される。) //=>function myfunc(x,y){ // return x + y; // } //Opera //=>function myfunc(x,y) // { // return x + y; // } var myfunc2 = function(a,b){ return a * b; }; var myresult3 = myfunc2(2,1);//=>2 //右辺のみ代入される。 var myresult4 = myfunc2; //Firefox(IEとOperaは前の例と同じ法則で出力) //=>function(a,b){ // return a * b; // } var myfunc3 = new Function("m","n","return m-n"); var myresult5 = myfunc3(6,1);//=>5 var myresult6 = myfunc3; //Firefiox //=>function anonymous(m, n){ // return m - n; // } //IE //=>function anonymous(m, n){ // return m-n // } //Opera //=>function (m,n) // { // return m - n; // }