私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

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の関数では、型付けが弱いので、引数チェックをしっかりと行う必要がある。