标签:递归 javascript
看到了《javascript高级程序设计》的第七章递归部分,于是就整理一下理清头绪
不太会用这里的编辑器代码排版乱七八糟的……
一些递归中容易出错的点和发生的错误
1.通过函数名字调用自身,当这个函数被赋给别的变量,然后这个函数变为null或其他非函数值时
比如说
function factorial(num){ if (num<=1) { return 1; } else{ return num*factorial(num-1); } }
这里通过函数名字factorial调用自身
如果用
var anotherFactorial = factorial; factorial = null; alert(anotherFactorial(4));//出错啦!{{{(>_< )}}}
因为 factorial已经不是一个函数了,但用anotherFactorial的时候还是会执行 return num*factorial(num-1); 就会导致错误
所以可以使用arguments.callee来解决
我们来复习一下arguments.callee
arguments是一个类数组对象,包含着传入函数中的所有参数。主要作用是保存函数参数。
它有一个叫callee的属性,是一个指针,指向拥有这个arguments对象的函数。
所以即使这个递归函数换了别的名字都可以完成调用啦(Θ )
2.然而在严格模式下,不能通过脚本访问arguments.callee,会导致错误。
所以可以使用命名函数表达式来完成。
var factorial = (function f(num) { if (num<=1) { return 1; } else{ return num*f(num-1); } } );
f()是内部函数所以即使在外部令 f= null; 也仍然是可以正常运行。
本文出自 “写代码的郭德纲” 博客,请务必保留此出处http://atuzi.blog.51cto.com/7743360/1753492
标签:递归 javascript
原文地址:http://atuzi.blog.51cto.com/7743360/1753492