JS经典递归及其易错点

先看下代码:

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));  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,259评论 0 38
  •   函数表达式是 JavaScript 中的一个既强大有容易令人困惑的特性。定义函数的的方式有两种: 函数声明; ...
    霜天晓阅读 893评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,690评论 0 4
  • 今天踢了一场友谊足球赛,输了,很是失望,本来我一个带球欲望比谁都强烈的人都能为了赢球委身做个中场,但是一群新手在哪...
    派斯卡特阅读 353评论 1 0
  • 哄小轰阅读 190评论 0 0

友情链接更多精彩内容