関数 (function)

関数の定義

function FunctionName( x, y ) { return x * y; }

関数リテラル

関数リテラルでは関数名を省略できます。このように定義された関数はラムダ関数または匿名関数 (Anonymous Function) と呼ばれ、変数に格納したり他の関数に渡すためだけに定義される関数の記述に適しています。

var FunctionName = function( x, y ) { return x * y; }

なおJavaScript1.5以降では関数リテラルでも関数名を付けることができ、再帰関数を作ることができます。

Function()コンストラクタ

関数を実行時に動的に生成します。以下のコードは、前述のコードと同義のものです。

var FunctionName = new Function( 'x', 'y', 'return x * y;' );

関数の作成はfunctionではなくFunctionで行います。そして最後の引数が関数の本体となります。

関数のスコープ

Callオブジェクト

グローバルな空間での変数名やプロパティ名の衝突を避けるには、次のように匿名関数を定義して実行します。

( function()  // 匿名関数として定義
{
    var a = 0; // この変数はこのスコープ内でのみ有効

} )();  // ここで関数が実行される

引数

引数の数

JavaScriptでは関数呼び出し時の引数の数は、問題とされません。

引数が多すぎた場合は、その引数は無視されます。
引数が少なすぎた場合は、不足している引数に未定義値 (undefined) が設定されます。

function FunctionName( x, y ) // 引数は2つ
{
    document.write( x ); // 結果は 256
    document.write( y ); // 結果は undefined
}

// 引数を1つだけ指定して、関数を呼び出す
FunctionName( 256 );

値渡しと参照渡し

引数を「値で渡す」か「参照で渡す」かはC言語のように明示的に指示する方法はなく、引数のデータ型によって決定されます。

データ型 値渡し/参照渡し
基本データ型 数値 値渡し
文字列
論理値
複合データ型 オブジェクト 参照渡し
配列
関数

Argumentsオブジェクト

関数内では、arguments変数によりArgumentsオブジェクトを参照できます。Argumentsオブジェクトは番号付けされたプロパティを持ち、これにより関数に渡された引数に配列のようにアクセスできます。

function Foo( a, b, c )
{
    console.log( a );  // 1
    console.log( b );  // 2
    console.log( c );  // undefined

    console.log( arguments );  // [1, 2]
}

Foo( 1, 2 );

参照