サイ本読書記 8章 関数

ここ暫く時間が取れなかったサイ本読書記ですが、ようやく8章を読めました。
8章は関数について詳しく解説しています。

組み込み関数とユーザ定義関数は同じ感覚で使える

…というのは利点な気もするけど、超初心者の頃は例によって分りづらかった。 用意されてる物とそうでない物がごっちゃになって混乱してた。

return文

そもそもreturn文は必須ではない。
return文の役割は、その時点で処理を中断して値を返す。

例えば

function print() {
 var n = 3;
}

document.write(print("hoge" + print));

とするとundefinedになる。

function print() {
 var n = 3;
 return n + 2;
}

document.write(print("hoge" + print));

のようにreturnで返す値を指定しておけば、返る値で処理ができたりする。。。って事なのかな><
ちなみにこの結果は5になる。

関数の入れ子

function文で定義した場合、関数の入れ子はifやwhileの中では定義できないらしい。
よくわからなかった。

関数リテラル

function hoge() {}  // function文
var hoge = function() {}  // 関数リテラル
匿名関数

関数リテラルは匿名関数を生成する。 匿名関数とは言っても関数名を付ける事ができる。

var hoge = function foo() {}  // 匿名だけど名前がついてる関数

ちょっと分りづらいんだけど、関数リテラルの時点で匿名関数である事が決まっていて、関数名の有無は匿名かどうかには関係ないようだ(日本語の文言的なアレで混乱しやすい)。 名前を付けておくと再起呼び出しの時に便利。

再起呼び出し
var hoge = function foo(n) {
 if(n == 1) {
  document.write("1");
 } else {
 document.write( n * foo(n + 1));
 }
}

サンプルコードがちょっと変かも><
再起呼び出しって言うのは、Aっていう関数の中でA自身が登場する事。 プログラミング全般的な用語。

関数の命名規則

  • アンダースコアやキャメライズが一般的
  • 内部でのみ使う関数や不可視にしたい関数はアンダースコアから始める名前にする慣習があるらしい

関係無いですけど、Perlはアンダースコアで繋ぐのが一般的なんだとか。 HTMLとCSSだとキャメライズが最近は多いのかな。 そういう言語ごとの文化みたいのも色々と面白そう。

引数の数について

JSでは、引数は増えても減ってもいい(エラーにならいという意味で)。 ただし無視されたりする。
例えば

function hoge(msg, n, k) { }

のような関数を呼び出す時に、

hoge("ほげほげ");

と1つしか引数を指定しなかった場合、残りの二つの引数は未定義値が設定される。 また逆のパターンも可能で、

function hoge(msg) { }

のような関数を呼び出す時に、

hoge("ほげほげ", 100, 0325);

とした場合、この場合で言うと後の二つの引数は無視される。無視の基準は単に順番。

Argumentsオブジェクト

関数に定義された引数より多い引数を渡しても通常は無視されるが、Argumentsオブジェクトのargumentsプロパティで参照する事ができる。 Argumentsオブジェクトは「配列のような」オブジェクト。

function hoge(h, j, k) {
 document.write(h + j + k);
}

hoge(1,2,3,4,5);

関数hogeに渡す引数1,2,3,4,5の内、4と5は無視される。 しかし

function hoge(h, j, k) {
 document.write(arguments[4]);
}

hoge(1,2,3,4,5);

とすると5番目の引数(つまり5)を参照する事ができる。 つまり、関数に定義された数以上の引数を渡した場合、溢れた引数は消滅している訳ではない。

配列のようなオブジェクト
// 配列
function hoge(n) {
 a = [];
 a[0] = n;
 n = 2;
 document.write(a[0]);
}

hoge(1);

とすると、出力されるのは1のまま。

// 配列のような
function hoge(n) {
 arguments[0] = 2
 document.write(arguments[0]);
}

hoge(1);

とすると、出力されるのは2になる。

lengthプロパティ

function hoge (h,j,k,l) {
 document.write(hoge.length);
}

hoge(3, 100);

とすると、関数に宣言された引数の数を参照する。 ここでは4が出力される。

function hoge (h,j,k,l) {
 document.write(arguments.length);
}

hoge(3, 100);

とすると、関数に渡された引数の数を参照する。 ここでは2が出力される。