递归中容易出错的点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归中容易出错的点相关的知识,希望对你有一定的参考价值。

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

以上是关于递归中容易出错的点的主要内容,如果未能解决你的问题,请参考以下文章

6-17——调用数组作为参数的函数时,容易出错的点

6-17——调用数组作为参数的函数时,容易出错的点

6-17——调用数组作为参数的函数时,容易出错的点

vue递归组件的一些理解

js 一些容易错的点

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?