90   JS

JS函数有个默认的参数arguments,它是一个对象,但却可以以数组方式访问

function main(){

console.log(arguments);

console.log(arguments[1]);

console.log(arguments[2]);

}

main(1,2)

QQ图片20190915212333

 

 

可以看到,arguments是一个对象,只是有下标0,1,2的属性,所以能通过数组方式访问这些属性值;

另外,arguments有一个参数callee,指向函数本身,可以通过此属性实现匿名函数的递归调用

 

采用函数名称实现递归调用

function factorial (num) { 
    if (num < 0) { 
        return -1; 
    } else if (num === 0 || num === 1) { 
        return 1; 
    } else { 
        return (num * factorial(num - 1)); 
    } 
};
factorial(6);

 

这种实现方式有个缺点,就是需要用到函数名称,这种耦合性会有隐患,比如该函数赋值给另外一个参数,则会无效

var factorialCopy = factorial;
factorialCopy(6)

 

 

为了避免这种情况,我们可以通过argumens的callee特性来实现

function factorial (num) { 
    if (num < 0) { 
        return -1; 
    } else if (num === 0 || num === 1) { 
        return 1; 
    } else { 
        return (num * arguments.callee(num - 1)); 
    } 
};
factorial(6);
var factorialCopy = factorial;
factorialCopy(6);

 

 

这种情况,避免了使用函数名称,所以不会出现上面的隐患。

但是严格模式下,arguments.callee无法正常访问,更完美的解决方式是采用命名函数方式

 

var factorial = (function f(num){
    if (num <= 1){
        return 1;
    } else {
        return num * f(num-1);
    }
});



Leave a Reply

Your email address will not be published. Required fields are marked *