本文共 912 字,大约阅读时间需要 3 分钟。
传统递归阶乘函数:
function factorial(num){ if (num <= 1){ return 1; } else { return num * factorial(num-1); }}
虽然这个函数表面看来没什么问题,但下面的代码却可能导致它出错。
var anotherFactorial = factorial; factorial = null;alert(anotherFactorial(4)); //出错!
当把递归函数保存为其他变量名时,由于在函数内部使用了 原函数名,导致错误,这时我们可以通过 使用 arguments.callee 可以解决这个问题。
arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数 的递归调用, 上例可以修改为:
function factorial(num){ if (num <= 1){ return 1; } else { return num * arguments.callee(num-1); } }
通过使用 arguments.callee 代替函数名,可以确保无论怎样调用函数都不会 出问题。因此,在编写递归函数时,使用 arguments.callee 总比使用函数名更保险。
但在严格模式下,不能通过脚本访问 arguments.callee,访问这个属性会导致错误。不过,可 以使用命名函数表达式来达成相同的结果。
var factorial = (function f(num){ if (num <= 1){ return 1; } else { return num * f(num-1); } });
以上代码创建了一个名为 f()的命名函数表达式,然后将它赋值给变量 factorial。即便把函数 赋值给了另一个变量,函数的名字 f 仍然有效,所以递归调用照样能正确完成。这种方式在严格模式和 非严格模式下都行得通。
转载地址:http://cxvii.baihongyu.com/