Javascript 第5版 第8章
2010/01/13(水) 22:36 Javascript親記事へはてブ情報 はてブに登録 はてブ数

8.1.1 入れ子型の関数

function内に入れ子で関数を定義できるが、
ifやforなどの文ブロック中には定義できない(関数リテラルは除く
function main(){
	function(){
	// OK
	}
	if(true){
		function(){
		// ダメ
		}
		var k = function(){
		// OK
		}
	}
}

8.2.1省略可能な引数

関数で引数を省略したときに、デフォルト値を設定する
if(!elem) はelemがnullまたは未定義でないかを判定できる。
同様にelem = elem || []; はelemが存在するならelemeを代入、そうでないなら[]を代入となる。
function test(o){
    if(!o) o = [];// oを指定しない時
}
function test(o){
    var o = o || [];// 上と同じ意味
}

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

argumentsは関数内で使うことができ、配列のようなオブジェクトで、
中身に関数を呼び出したときの引数が入っている。
!Argumentsオブジェクト≠配列
function test(){
    console.log(arguments);// [1,2,3]}
test(1,2,3)

これを利用すれば、可変長の引数を持つ関数も作ることができる。
仮引数は定義しないで、argumentsで引数を得ることで引数内の最大値を返す
function max(/* ... */){
    var m = Number.NEGATIVE_INFINITY;//数値型の-Infinityを代入
    for(var i=0,l=arguments.length;i<l;i++){
        if(arguments[i] > m) m = arguments[i];
    }
    return m;// 30
}
max(1,3,5,30, -2);

8.2.2.1 calleeプロパティ

Argumentsオブジェクトにはcalleeというプロパティが定義されている。
arguments.calleeは現在実行中の関数を参照するので、関数内で使えば、自身を呼び出すので、
再帰的に呼び出す関数を作成できます。
(function(x){
    if(x <=1)return 1;
    return x * arguments.callee(x-1);//arguments.calleeは呼び出した関数そのもの
    // 5*4*3*2*1 = 120 となる
})(5)

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/024/tb/