JavaScript 第5版 - 8章 関数(1)

JavaScript 第5版、「8章 関数」の「8.1 関数の定義と呼び出し」~「8.2 関数の引数」(123~132ページ)を読み進めていきます。

8.1 関数の定義と呼び出し

  • 関数に渡された引数の個数が、仮引数の個数より多かった場合、余分な値は無視される。仮引数の個数より少なかった場合、その部分の値は未定義値と見なされる。

8.2 関数の引数

8.2.2 可変長の引数リスト(Argumentsオブジェクト)

  • 関数に渡された引数値は、Argumentsオブジェクトを参照するargumentsプロパティに格納される。Argumentsオブジェクトは配列のようなオブジェクトである(7.8節を参照)。

argumentsオブジェクトを使うと、関数に渡された引数の個数をチェックしたり、任意の個数の引数を受け取ることのできる可変長引数関数(varargs関数)を定義できます。

function f(x, y, z) {
    // 渡された引数の個数をチェック
    if (arguments.length != 3) {
        throw new Error('function f called with ' + arguments.length + 'arguments, but it expects 3 arguments.');
    }
}
function f() {  // 引数の個数は可変
    // 全ての引数を調べる
    for (var i = 0; i < arguments.length; i ++) {
        // 処理
    }
}

また、引数が格納されたローカル変数とargumentsオブジェクトの整数値プロパティは同じ値を保持します。つまり、どちらからでも同じ値を参照でき、どちらかの値を変更するともう一方の値も変更されます。

function f(x) {
    arguments[0] = null;  // xの値も変更される。
}

8.2.2.1 calleeプロパティ

  • Argumentsオブジェクトに定義されているcalleeプロパティは、現在実行中の関数を参照する。

calleeプロパティを利用することで、再帰的処理を行う匿名関数を記述できます。

// 階乗を計算する匿名関数リテラル
function(x) {
    if (x <= 1) return 1;
    return x * arguments.callee(x - 1);
}

8.2.4 引数の型

JavaScriptは弱い型付きの言語なので、引数の型を限定する場合には型をチェックする処理を追加します。

// 引数aに配列、または配列のようなオブジェクトを取る関数
function f(a) {
    if ((a instanceof Array) ||  // 配列か?
        (a && typeof a == 'object' && 'length' in a)) {  // 配列のようなオブジェクトか?
        // 処理
    } else {
        throw new Error('f(): argument must be an array');
    }
}

131~132ページには、引数の個数や型に柔軟に対応する関数の例が掲載されています。

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/73/trackback/
この記事のURI
http://dxd8.com/archives/73/