JS函数有个默认的参数arguments,它是一个对象,但却可以以数组方式访问
function main(){
console.log(arguments);
console.log(arguments[1]);
console.log(arguments[2]);
}
main(1,2)

可以看到,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