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

递归函数


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

简单说就是有两个条件:

  1. 在函数内部引用自身。

  2. 每个递归函数里必定有一个终止条件。

来个小李子:

function test(num){
    if(num <= 1){
        return 1;
    }else{
        return num * test(num-1);
    }
}
var a = test;
console.log(a(6)); 

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

var a = test;
test = null;
console.log(a(6)); // Uncaught TypeError: test is not a function

居然报错了

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

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

然后测试一下:

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

用arguments.callee可解决问题,这是一个指向正在执行的函数的指针,arguments.callee返回正在被执行的对现象。

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

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);
    }
});

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

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

<( ̄︶ ̄)><( ̄︶ ̄)><( ̄︶ ̄)><( ̄︶ ̄)><( ̄︶ ̄)><( ̄︶ ̄)><( ̄︶ ̄)>

javascript --- 递归的简单理解的更多相关文章

  1. JavaScript Decorators 的简单理解

    Decorators,装饰器的意思, 所谓装饰就是对一个物件进行美化,让它变得更漂亮.最直观的例子就是房屋装修.你买了一套房子,但是毛坯房,你肯定不想住,那就对它装饰一下,床,桌子,电视,冰箱等一通买 ...

  2. javascript 闭包最简单理解

    首先说3点与闭包有关系的东西. 一.变量的作用域 变量的作用域不难理解. 1.函数内部可以访问函数外部的变量,而函数外部不能访问函数内部的变量. 2.如果在函数内定义变量的时候,不加var,那么是全局 ...

  3. JavaScript设计模式的简单理解

    设计模式可以理解为一系列的代码框架,我觉得主要涉及封装的概念.把实现某一功能的代码段封装在函数中,可以方便调用,同时利于代码的复用,提高了代码的可维护性.下面简单介绍一下几种设计模式的个人感受. 1. ...

  4. javascript笔记—— call 简单理解

    call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN ...

  5. 简单理解JavaScript闭包

    很多关于JS的书籍例如<JavaScript权威指南>或者<高程>都把闭包解释的晦涩难懂,萌新们是怎么也看不懂啊!不过别怕,今天我就用很简单的方式给大家讲解下到底什么是闭包.这 ...

  6. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

  7. Javascript的堆和栈的简单理解

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 简单理解JavaScript原型链

    简单理解原型链 什么是原型 ? 我是这样理解的:每一个JavaScript对象在创建的时候就会与之关联另外一个特殊的对象,这个对象就是我们常说的原型对象,每一个对象都会从原型"继承" ...

  9. Javascript闭包简单理解

    提到闭包,想必大家都早有耳闻,下面说下我的简单理解.平时写代码.第三方框架和组件都或多或少用到了闭包.所以,了解闭包是非常必要的.呵呵... 一.什么是闭包简而言之,就是能够读取其他函数内部变量的函数 ...

随机推荐

  1. 水题:51Nod1095-Anigram单词

    1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Description 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那 ...

  2. Linux学习-什么是进程 (process)

    触发 任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定.从此以后,这 个 PID ...

  3. foreach遍历数组的表格

    <?php /** * * @authors Your Name (you@example.org) * @date 2017-03-17 19:06:19 * @version $Id$ */ ...

  4. 1507: [NOI2003]Editor(块状链表)

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4157  Solved: 1677[Submit][Stat ...

  5. Django Model one

    models :URL---->http://www.cnblogs.com/wupeiqi/p/6216618.html null                     数据库中字段是否可以 ...

  6. rocketmq源码分析1-benchmark学习

    benchmark 分析 组成部分 三个java类,都含有main方法,可选的传递一些参数,诸如测试线程数量,消息体积大小.三个类分别用于测试普通生产者,事务生产者,消费者.生产者 默认64个测试线程 ...

  7. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

  8. Web网站性能测试分析及调优实例

    1 背景   前段时间,性能测试团队经历了一个规模较大的门户网站的性能优化工作,该网站的开发和合作涉及多个组织和部门,而且网站的重要性不言而喻,同时上线时间非常紧迫,关注度也很高,所以对于整个团队的压 ...

  9. 安装adb工包

    下载android sdk (很大) 从D:\AndroidSdk\platform-tools目录可以看到: 将adb工具包: adb.exe,AdbWinapi.dll,AdbWinUSBapi. ...

  10. TOJ4277: Sequence 组合数学

    4277: Sequence Time Limit(Common/Java):2000MS/6000MS     Memory Limit:65536KByte Total Submit: 39   ...