しまてく

学んだ技術を書きためるブログ

(function(){ return やる気; })();

関数と関数リテラルの違い

関数
    • 例えばこんな
function square( x ) {
    return x * x;
}


⇒常にトップレベルに定義しないといけない。(if文やwhile文の中では定義できない)

関数リテラル
    • 例えばこんな
// 階乗する関数。関数に名前をつけることで再帰呼び出しをしている。
var f = function factorial( x ) {
    if( x <= 1 ) {
        return 1;
    } else {
        return x * factorial( x - 1 );
    }
}
可変長の引数リスト

関数の引数は定義した仮引数以外にも、Arguments オブジェクトでアクセスできます。

    • 例えばこんな
function Sum( /* 引数いくつでも */ ) {
    var result;
    for( var i = 0; i < arguments.length; i++ ) {
        result += arguments[ i ];
    }
    return result;
}

var answer = Sum( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ); // answer は 55

可変長の引数と聞くと 文字列のFormat関数が真っ先に思い浮かびました!
でもJavaScriptって型に厳しくないからそんなの必要ないですね><

callee プロパティ

これはArguments オブジェクトの一プロパティなんですが、今まで知りませんでした。
「callee プロパティは、現在実行中の関数を参照します。」とあります。
実際に試してみた↓

function Sum( x ) {
    if( x <= 1 ) return x;
    return x + arguments.callee( x - 1 );
}

alert( Sum ( 10 ) );  // 出力は 55

おお!なるほど、まさしく自分自身を参照してますね!


サイ本読んでて思ったこと
  JavaScriptって奥深すぎ><
普段ぜんぜん知らないで使ってたんだなーって思い知ったです。


もうすぐでオブジェクト指向的になるぞ☆