首页 > 其他 > 详细

递归中容易出错的点

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

看到了《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

递归中容易出错的点

原文:http://atuzi.blog.51cto.com/7743360/1753492

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!