美文网首页我爱编程
JS经典递归及其易错点

JS经典递归及其易错点

作者: jasonhsu9 | 来源:发表于2018-03-31 21:45 被阅读0次

先看下代码:

function factorial(num){  
    if(num<=1){  
        return 1;  
    }else{  
        return num*factorial(num-1);  
    }  
}  
var anotherFactorial=factorial;  
factorial=null;  
alert(anotherFactorial(4));  

一看这是一段很典型的递归阶乘函数
不过细心一看不难发现,这段code有一个很大的bug

执行的时候将会将会报错

原因就在于 factorial=null 这一句,可别忘了我们在factorial 递归时引用了自身的
当我们将factorial复制给 anotherFactorial 时,这并没什么问题,问题就在factorial=null,由于递归体调用了自身,故清除原函数无非是“自杀行为”还好JS提供了处理类似问题的方法:argument.callee

该方法是一个指向正在执行的函数的指针,因此可以用她来实现对函数的递归调用

修正后的code

function factorial(num){  
    if(num<=1){  
        return 1;  
    }else{  
        return num*arguments.callee(num-1);  
    }  
}  
var anotherFactorial=factorial;  
factorial=null;  
alert(anotherFactorial(4));  

但是在严格模式下,上面那段修正后的code又有问题了

因为在严格模式下 不能通过脚本访问argument.call ,访问这个属性会导致错误。

解决这个问题可以用命名函数表达式

var factorial=(function f(num){  
    if(num<=1){  
        return 1;  
    }else{  
        return num*f(num-1);  
    }  
});
var anotherFactorial=factorial;  
factorial=null;  
alert(anotherFactorial(4));  

相关文章

  • JS经典递归及其易错点

    先看下代码: 一看这是一段很典型的递归阶乘函数不过细心一看不难发现,这段code有一个很大的bug 执行的时候将会...

  • Js易错点梳理

    前言 本文是学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,...

  • 2020-03-08

    学习小组day2笔记——肖舒 Linux入门 -常用的基本操作及其易错点

  • js 属性继承易错点

    在js世界中,原型继承是一个最普通的行为,但是这里面有一个易错点需要我们多加留意。 如下是创建了两个类Person...

  • 易错点

    rate_ave=1042.00/793 而非rate_ave=1042/793if rate>=rate_av...

  • 易错点

    泛型 泛型约束使用extends而非implements 泛型类型没有多态的说法,所以出现了?通配符 泛型方法必须...

  • 使用思维导图总结Vue.js官方文档(例子优化、难点及易错点注释

    上篇文章 使用思维导图总结Vue.js官方文档(例子优化、难点及易错点注释)【上】 完成了Vue.js官网基础部...

  • 四级备考笔记

    易错点 NOT!!

  • js成神之路:目录

    目录 第一章:js常用易错运算符 第二章:js函数特性

  • leetcode40M

    思路: 先排序,然后递归遍历,即如果包括这个数怎么样,如果不包括怎么样,但要添加判断(20行) 易错点1:去重,关...

网友评论

    本文标题:JS经典递归及其易错点

    本文链接:https://www.haomeiwen.com/subject/ahuncftx.html