Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 如何使用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); }});然后我测试了以下,神奇的通过了,暂时没有发现任何问题!为什么呢?因为我们使用了“()”,巧妙地使用命名函数表达式来达到了同样的效果。

参考资料

《JavaScript高级程序设计(第三版)》 http://www.linuxidc.com/Linux/2014-09/107426.htm 本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-01/112000.htm