在函数内部,有两个特殊的对象:arguments和this。
argument对象有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。请看下面这个非常经典的阶乘函数。
function factorial(num) { if (num <= 1) { return 1; } else { return num*factorial(num-1); } }
这种写法的问题在于函数的执行和函数名factorial紧紧耦合在一起。可以像下面这样使用arguments.callee.
function factorial(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num-1); } }
在这个重写后的factorial()函数的函数体内,没有再引用函数名factoria。这样,无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。例如:
var trueFactorial = factorial; factorial = function() { return 0; }; alert(trueFactorial(5)); // 120 alert(factorial(5)); // 0
时间: 2024-10-02 18:49:40