arguments.callee

在递归时,都是在一定条件下调用函数自身

  • 但这样蹲在一个问题,当函数名称被重新赋值,递归内部就调用不到这个函数,会报错;

    function fbi(n) {
            if(n<=1) {
                return 1;
            }else {
                return n * fbi(n-1);
            }
    }
    fbi(4) //24
    

注意:
var newfbi = fbi;
fbi = null;
newfbi(4) //error;

所以如果不调用函数名,而是调用这个函数指针,就不会出错;那就是用arguments.callee

function fbi(n) {
            if(n<=1) {
                return 1;
            }else {
                return n * arguments.callee(n-1);
            }
    }
    fbi(4) //24

但是这用方法已经不建议使用,那就使用闭包
+ 我的理解就是,不是当前函数递归,而是函数内部进行递归,然后将递归的值返回;

    function fbi(n) {
        return (function fn(){
            n--;
            if(n<=1) {
                return 1;
            }else {
                return (n+1)*fn()//首先减一,所以这个地方比n要加1
            }
        })()
    }
fbi(4)//24

你可能感兴趣的:(arguments.callee)