JavaScript 第5版 8章 関数
ああ。やっと関数まで来た。面白そうだ。
関数の特徴
8.1 関数の定義と呼び出し
function文は、
-
- 先頭にfunctionキーワード
- その後に関数名を指定し(必須)、
- ()内に引数を指定し、
- 関数本体を{}に記述する。
関数は入れ子にできる。
function f1(){ function f2(){return 2;} return 1; }
関数リテラルは、
-
- 文ではなく式で、
- function文とほぼ同じで、
- 関数名は不要で、
- 変数に格納できる。
関数名を付けても、関数外から参照できない。
var f = function f1(){alert(1);}; f(); // 1 f1(); // 構文エラー f1 is not found
関数内からは参照できる。
var i = 0; var f = function f1(){ // 再帰呼び出し f1(); }; f();
関数呼び出し時、引数定義と異なる引数を指定しても問題ない。任意の引数を渡すことができる。よって、引数は省略可能。省略された引数はundefined。省略された場合のコードを書く必要がある。
Argumentsオブジェクト
関数内では、関数に渡された引数を表すArgumentsオブジェクトを参照できる。Argumentsオブジェクトはarguments識別子が参照している。Argumentsオブジェクトは配列用のようなオブジェクトで、インデックスを使用して引数にアクセスする。
function f(){ alert(arguments.length); } f(1,2,3); // 3
calleeプロパティ
Argumentsオブジェクトにはcalleeプロパティがあり、関数自身を参照する。再帰呼び出しに利用できる。
function f(x){ if(x > 10){return x;} return arguments.callee(++x); } var x = f(1); alert(x); // 11
引数の順序を覚えるのが面倒なので、Key/Valueのマッピングオブジェクトを引数として渡す方法もある。
// 順序を覚えておく必要がある関数 function f1(a, b, c, d, e, f){ // 処理 } f1(1, 2, 3, 4, 5); // 順序を覚えておく必要がない関数(ただし、引数の種類は知っておく必要がある) function f2(map){ var a = map.a; var b = map.b; var c = map.c; var d = map.d; var e = map.e; // 処理 } f1({a:1, b:2, c:3, d:4, e:5});
JavaScriptの関数では、型付けが弱いので、引数チェックをしっかりと行う必要がある。