- 2008-02-15 (金)
- JavaScript
↑このあたりとかオライリーサイ本124Pあたりを見ながら。
function factorial(x) {
if (x <= 1)
return 1;
return x * factorial(x-1);
}
for (i=1; i<10; i++)
console.log(factorial(i));
で、こういう値が返ってくる。
1 2 6 24 120 720 5040 40320 362880
再帰関数か。かっこいいなー。
使いたいw
var factorial = function(n) {
if (n == 0) {
return 1;
} else {
return n * arguments.callee(n - 1);
}
}
for (i=1; i<10; i++)
console.log(factorial(i));
しかし、関数が匿名関数の場合はどうだろう。再帰処理に際して呼び出すべき名前がないので、この場合は、calleeプロパティを利用する必要があるというわけだ。
なるほど。無名関数の場合はargumentsオブジェクトの
calleeプロパティを使って参照すればいいのかー。
うん、珍しくきれいに納得できたーと思ったら
[参考]argumentsオブジェクトの実体厳密には、JavaScriptは関数呼び出しのタイミングで、ローカル変数や引数情報を、Activation Object(通称、「Callオブジェクト」とも呼ばれる)のプロパティとして格納している。argumentsオブジェクトも、その実体はCallオブジェクトのargumentsプロパティであある。
Callオブジェクトは、アプリケーション側から明示的に生成したり呼び出したりすることはできないし、通常は意識することすらない存在であるので、本稿ではただ単に「argumentsオブジェクト」と呼ぶものとする。
ん、なんだ?Callオブジェクトのプロパティ?
Activation ObjectがCallオブジェクトって呼ばれるんだ。
Activation Objectか、名前はちらちら見るけれど。。
このへんはまだ理解できてないな><
雰囲気だけ分かる。そしてそれは分かったとは言わないのだけれど。
- Newer: JavaScript はじめてのクロージャ入門
- Older: 福本マンガ風にするブックマークレットを作った