码迷,mamicode.com
首页 > 其他好文 > 详细

递归中容易出错的点

时间:2016-03-21 16:41:50      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:递归   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!