美文网首页我爱编程
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经典递归及其易错点

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