首先,本篇需要【闭包】【arguments】【递归】几个知识点,如果你都很熟悉,请跳过这三个链接。
有关【闭包】的回顾请参照下面链接:
有关【arguments对象】的回顾请参考链接:
有关【递归】的回顾请参考链接:
如果你都很熟悉,请跳过链接。
1. arguments对象的属性
今天在写一个闭包函数的时候,突然想到了函数的arguments对象,我们知道arguments是函数的一个属性,只有在函数内部才能被调用。我们再次打印arguments
function fn(){
console.log(arguments)
}
fn(1,2)
图片
arguments.length 代表了实参的个数
arguments.callee 是函数本身,也就是说可以用它来调用函数自身。
那么当我们再次写闭包函数的时候,可以用arguments.callee代替函数自身呀
我们以斐波那契函数为例,再次写一个闭包函数求某个斐波那契值。
2. 求斐波那契数列 1、1、2、3、5、8、13、21...
观察规律,从第三项开始,当前项的值是前两项的和,如果当前数字是n,前两项就是n-1和n-2,递归状态:fb(n-1)+fb(n-2);
退出条件是:n为1和2的时候当前项都是1。
function fb(n) {
if (n === 1 || n === 2) {
return 1;
}
return fb(n - 1) + fb(n - 2);
}
console.log(fb(5)); // 5
用arguments.callee代替fb函数:
function fb(n) {
if (n === 1 || n === 2) {
return 1;
}
return arguments.callee(n - 1) + arguments.callee(n - 2);
}
console.log(fb(5)); // 5
下次我们在写一个方法调用本身的时候,记得arguments.callee哦。
网友评论