Javascriptで知っておくべき知識  > 関数定義

2006年09月21日

関数の定義

Javascriptで関数を定義する方法はいくつか存在します。

A.関数宣言

function func1(param1,param2){

 alert('param:'+param1+','+param2);

}

func1('A', 'B'); // param:A,B

B.関数式1(無名関数)

var func2 = function(param1,param2){

 alert('param:'+param1+','+param2);

}

func2('A', 'B'); // param:A,B

C.関数式2(Functionオブジェクトの実装)

var func3 = new Function('param1,param2',
           'alert("param:"+param1+","+param2);');

func3('A', 'B'); // param:A,B

Aは通常の関数の記述ですので詳しい説明は省略します。

Bは変数に関数を代入しています。こういう場合には、Aのような関数名は必要ないので関数名なし(無名関数)で記述します。また、関数の引数として直接関数を記述する場合にもこの無名関数がよく利用されます(Array.sort等)。

Cに関しては実際に使う機会はあまりありませんので頭の片隅に置いておく程度でいいと思います。

関数の実行

上記にも記述している通り実行時には、

func('A', 'B');

というように、関数名(関数式を代入した変数名)に ( + パラメータ + ) と記述します。これを応用した方法として、

(function(param1,param2){

 alert('param:'+param1+','+param2);

})('A','B') // param:A,B

このように、関数を宣言してすぐ実行するような記述も可能です。

これ以外にも、関数を実行する方法があります。callとapplyです。Functionオブジェクト全てに共通するメソッド(プロパティ)ですが、ここでの説明は割愛します。まだ別の機会に・・・

新しいオブジェクトの生成(重要)

Javascriptでの関数は、これに加えて新しいオブジェクトを生成する為のコンストラクタとしても利用されます。

var func5 = function(param1,param2){

 this.param1 = param1

 this.param2 = param2

}

var obj = new func5('A','B');

alert('param:'+obj.param1+','+obj.param2); // param:A,B

new演算子を用いて、オブジェクトを生成することができます。この方法の場合、オブジェクトを返すからと言って「return this;」と記述する必要はないので注意してください。

更に変数に関数を代入できるのと同様、オブジェクトのプロパティにも関数(関数オブジェクト)を代入できます。

var func5 = function(param1,param2){

 this.param1 = param1

 this.param2 = param2

 this.output = function(){

  alert('param:'+this.param1+','+obj.param2);

 }

}

var obj = new func5('A','B');

obj.output(); // param:A,B

最後に(読むと混乱するかも?)

もっとも実際には通常の関数を呼び出した場合も、内部的に新しいFunctionオブジェクトを作成し初期化する為、「オブジェクトの生成」と「通常の関数の挙動」は実は等価です。従って本来なら色々なパターンを説明する必要もないんですが、他の言語と比較するとどうしてもこういう書き方の方が分かりやすいかな?と思ったり、思わなかったり。


【トラックバック】

このエントリーのトラックバックURL: