function f(num){
if(num<=1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
alert(f(5)); //120
这里为什么结果会是120 arguments.callee(num-1);callee指向的是f
那么这个结果不应该是f(num-1) //5-1=4
为什么执行的是5*4*3*2*1 呢 原理是什么
function f(num){
if(num<=1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
alert(f(5)); //120
这里为什么结果会是120 arguments.callee(num-1);callee指向的是f
那么这个结果不应该是f(num-1) //5-1=4
为什么执行的是5*4*3*2*1 呢 原理是什么
因为是递归
当递归出口条件没达到会一直执行这个函数;
第一次是:5 x arguments.callee(4);
第二次是:5 x 4 x arguments.callee(3);
第三次是:5 x 4 x 3 x arguments.callee(2);
第四次是:5 x 4 x 3 x 2 x arguments.callee(1); //最后达到条件退出了
所以得到的结果是 5x4x3x2x1 = 120;
因为arguments.callee指向函数本身,因此上面的函数f等价于如下
function f(num){
// 如果num小于等于1,则终止递归
if(num<=1){
return 1;
}else{
// 如果num比1大,则继续递归
return num * f(num-1);
}
}
// 执行f(5),其实就是进行了一个 5 * 4 * 3 * 2 * 1的运算
f(5);
因此最终的结果自然是120了。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
https://developer.mozilla.org...
arguments.callee
指向当前正在被执行的函数,在这里也就是f