関数の定義と呼び出し
関数の基本的な使い方
関数とは、呼び出すことのできる処理の集まりのことです。プログラム内で何回も同じ処理をするようなときは、処理の部分を切り離して関数にしてしまうのがスマートなやり方です。そうすれば、何回も同じソースを書く必要がなくなるので、時間の節約にもなります。
例えば次のコードは、渡した数値を2倍にして返す関数を定義し、その関数を呼び出しています。
// 関数の定義 function func(V){ return V * 2; } // 関数の呼び出し var ret = func(10);
関数の宣言
関数は function で宣言します。
構文
function 関数名([引数[, 引数[, ... 引数]]]) { [命令文] }
- 関数名
- 関数名を指定します。呼び出すときはこの関数名を使います。
- 引数
- 関数は呼び出す際に値を渡すことができます。関数に渡す値のことを引数と呼びます。
引数は関数のブロック内で使うことができます。このとき渡される引数は値渡しとなります。関数内でその値をどのように変更しても、元の変数には影響ありません。ただし、オブジェクトは参照渡しとなります。
- 命令文
- 実行したい命令文を記述します。
- 返却値
- 関数が返す値のことを返却値と呼びます。返却値に指定したい値は、return キーワードを使って指定します。
関数は必ず値を返し、値の指定がない場合は undefined が返されます。
下記の例では引数を2倍にした値を返します。
// 関数の定義 function func(V){ return V * 2; }
関数の呼び出し
関数を呼び出すには、関数名とかっこを使って、以下のようにします。
func();
呼び出す際に引数を渡すことができます。
func(100);
関数の呼び出しは関数定義の前に行えます。
// 関数の呼び出しと、返却値の出力 console.log( func(100) ); // 関数の定義 function func(V){ return V * 2; }
200
クロージャ・無名関数と即時関数
無名関数の概要(関数リテラル)
関数名を付けず、関数式によって作成することができます。このような関数名がない関数を無名関数と呼びます。
var func= function(V) { return V * 2; }; console.log( func(10) );
20
ライブラリの作成時などに力を発揮しますが、簡単なところでは引数に関数を渡したいときなどに便利です。
var str = "test"; // replaceの第2引数に無名関数を渡しています var ret = str.replace(/[a-z]/g, function(v) { return v.toUpperCase(); }); console.log(ret);
TEST
無名関数を定義と同時に実行する
無名関数は次の構文で定義と同時に実行することができます。
構文
( function( ){...} )( );
たとえば次の無名関数は定義と同時に実行されます。
( function(){ console.log("hello"); } )();
hello
クロージャの概要
関数は自身のブロックの中に関数を内包することができます。
function outerFunc() { function func() { } }
内包された関数は親関数の変数にアクセスすることができます。内部の関数が外側の関数の変数にアクセスできる仕組みのことを、クロージャと呼びます。
function outerFunc() { var x = 2; return function (){ return x++; } } var func = outerFunc(); func();
2
func();
3
上記では、outerFunc()の内部にある無名関数が外側の関数の変数 x をインクリメントしています。
外側の関数の変数 x は永続化されて呼び出された後も値を保持しています。変数を永続化や隠蔽をするのがクロージャの利点です。
再帰関数
自分自身を呼び出す関数のことを再帰関数と呼びます。無限に関数が呼び出されないように、通常は終了条件を設定します。
function loop(x) { // 再帰関数の終了条件 if ( x >= 50 ) return; console.log( x ); // 再帰呼出し loop(x + 1); } loop(0);