• 如何使用javascript书写递归函数


    递归函数大家都应该比较熟吧?那么,如何在javascript中书写一个完美的递归函数呢?且听我娓娓道来。

    递归函数

    写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单的说说我对递归函数的理解吧。递归函数,说白了就是在函数内部引用函数自身,最终到给定的递归结束条件时回溯。当然,你也可以不给定结束条件,死了别挂我(╯﹏╰)

    使用javascript书写递归函数

    现在,一步一步,摩擦摩擦,在皎洁的编辑器上,来开始使用javascript写递归函数吧!

    function fun(num){
        if(num <= 1){
        return 1;
        } else{
        return num * fun(--num); 
        }
    }
    

    好了,不错,一个堪称经典的递归求阶乘的函数诞生了。事情肯定不会这么顺利,一定是个圈套。我们来如下调用以下看看会怎么样?

    var test = fun;
    fun = null;
    console.log(test(7));
    

    呵呵,居然报错了

    Uncaught TypeError: object is not a function
    

    嗯,报了类型错误。。。

    回过头去看看我们是如何调用的。发现问题了吧!我们把fun赋给了test,然后把fun给回收掉了。为什么会出错呢?因为像function这种赋值其实是引用传递,只是把指向函数的指针(这里说地址也行)赋给test了。但我们把fun赋值为null的时候,函数都已经被回收了,拿什么来执行?知道问题所在了,我决定换种方式来定义:

    function fun(num){
        if(num <= 1){
        return 1;
        } else{
        return num * arguments.callee(--num); 
        }
    }
    

    然后测试一下:

    var test = fun;
    fun = null;
    console.log(test(7));
    

    OK,测试通过!

    但是在某一天,当我实际码代码的时候,问题又出现了。什么问题呢?我们来看一下:

    Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them 
    

    ╮(╯▽╰)╭哎!可怜啊!因为我使用了"use strict"!严格模式下是不允许的。。。

    好吧!继续想办法!既然不能使用arguments.callee(),那还是想想其他的方式吧。

    看下面的代码:

    var fun = (function f(num){
        if(num <= 1){
        return 1;
        } else{
        return num * f(--num); 
        }
    });
    

    然后我测试了以下,神奇的通过了,暂时没有发现任何问题!

    为什么呢?因为我们使用了“()”,巧妙地使用命名函数表达式来达到了同样的效果。

    参考资料

    1. 《JavaScript高级程序设计(第三版)》
    2. 《JavaScript启示录》
  • 相关阅读:
    angular div contenteditable 属性,实现数据双向绑定
    node最简单的本地服务搭建
    picker-view、微信小程序自定义时间选择器(非官方)
    微信小程序wx.switchTab跳转到tab页面后onLoad里面的方法不执行
    小程序拨号功能,小程序点击按钮实现打电话功能
    css换行后缩进,css缩进技巧
    小程序循环列表,点击展开收起/关闭效果
    最新前端面试题-前端必备技能-前端技术汇总
    mapreduce处理天气数据
    基于Canal的数据感知服务平台
  • 原文地址:https://www.cnblogs.com/myqianlan/p/4195998.html
Copyright © 2020-2023  润新知