美文网首页程序员Web前端之路让前端飞
JavaScript使用递归的最佳方案

JavaScript使用递归的最佳方案

作者: 不洗头的野人 | 来源:发表于2017-03-29 09:03 被阅读163次

文章介绍

本文很简短,主要讲解的是使用递归时会遇到的坑,以及解决的办法。并不会讲解递归是什么和它的工作原理是什么!

内容

首先,我们以经典的阶乘函数为例:

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

以上代码正常使用并不会出现什么错误,但是如果有一天,我突然觉得这函数名太长了,想把它改改,改成如下:

function factorial (num) {
    if (num <= 1) {
        return 1;
    } else {
        return factorial(num-1) * num;
    }
}
//注:函数指的是函数对象,而不是标识符fac、factorial
//该函数引用+1 
var fac = factorial;
//该函数引用-1
factorial = null;
var n = fac(10); //报错!

因为函数的内部 return factorial(num-1) * num; 依然使用着标识符factorial,而为了让函数的引用数-1,我们已经让factorial置为null(这是很常见的做法)。因此报错!

所以这样写一个递归函数,代码的容错性是很低的!

因为我们可以利用arguments.callee来解决这个问题:

function factorial (num) {
    if (num <= 1) {
        return 1;
    } else {
        return arguments.callee(num-1) * num;
    }
}
var fac = factorial;
factorial = null;
var n = fac(10); //运行正常

但是,在严格模式下,不能使用arguments.callee这个属性。我在另一篇文章有介绍严格模式--详解JavaScript严格模式

因此在严格模式下,我们就必须要使用到函数名来调用,并且修改函数名后,依然能正常使用。
那么我们可以利用命名函数表达式来实现

var factorial = function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return f(num-1) * num;
    }
};
var fac = factorial;
factorial = null;
var n = fac(10); //运行正常

这样,我们就能随意更改函数名了!

注意:写成这样,全局作用域是访问不到f的
上面例子中,console.log(f); 将会报错!

相关文章

  • JavaScript使用递归的最佳方案

    文章介绍 本文很简短,主要讲解的是使用递归时会遇到的坑,以及解决的办法。并不会讲解递归是什么和它的工作原理是什么!...

  • 你可能不知道的递归

    递归 尾递归 CPS trampoline memoize 缓存 本文使用 JavaScript 进行描述。本文简...

  • JavaScript递归函数

    JavaScript 支持函数的递归调用。 所谓递归函数,就是在函数体内调用函数本身。 使用递归函数的一个常见例子...

  • javascript 基础

    JavaScript 显示方案 JavaScript 能够以不同方式“显示”数据: 使用 window.alert...

  • 前端面试题总结(算法)

    javascript递归遍历所有DOM文档节点 javascript递归遍历所有DOM文档节点 HTTP 方法:G...

  • 21. Merge Two Sorted Lists

    Java Javascript 递归解

  • 第3章 递归

    递归(Recursion),又译为递回,是指在函数的定义中使用函数自身的方法。 递归只是让解决方案更清晰,并没有性...

  • js 如何禁止选中文本

    js最佳方案 css最佳方案

  • 25个 js技巧

    1. 类型检查小工具 JavaScript 不是强类型语言,对此我推荐的最佳解决方案是 TypeScript。但有...

  • 前端算法学习-前篇

    递归 JavaScript中允许函数递归调用,示例: 当一个函数呗递归调用时,递归没有完成,函数的计算结果会被暂时...

网友评论

    本文标题:JavaScript使用递归的最佳方案

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