博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中的递归
阅读量:6837 次
发布时间:2019-06-26

本文共 1154 字,大约阅读时间需要 3 分钟。

hot3.png

递归函数是在一个函数通过名字调用自身的情况下构成的,在中曾拿来举过例子:

//阶乘函数function factorial(num){  if(num <= 1){    return 1;  }else{    return num * factorial(num - 1);  }}console.log(factorial(4));//24

这种写法在函数有名字,而且名字以后也不会变的情况下是没有问题的。但是函数的执行与函数名factorial紧紧耦合在了一起,当函数名发生变化时,调用就出现了问题:

var trueFactorial = factorial;factorial = null;console.log(trueFactorial(4));//Uncaught TypeError: factorial is not a function

使用arguments.callee可以达到解耦的目的:

function factorial(num){  if(num <= 1){    return 1;  }else{    return num * arguments.callee(num - 1);  }}var trueFactorial = factorial;factorial = null;console.log(trueFactorial(4));// 24

如代码所示,无论将来函数名如何变化,始终都能保证正确的执行结果。

其中还说到,在严格模式下JavaScript是不支持arguments的,那么此时要实现一个松散耦合的递归函数该怎么实现呢?也很简单,可以结合使用函数表达式与函数声明的方式来定义递归函数:

var factorial = function f(num){  if(num <= 1){    return num;  }else{    return num * f(num - 1);  }}console.log(factorial(5));// 120console.log(f(5));// Uncaught ReferenceError: f is not defined

这样声明的函数,函数名是f但是在作用域中存在的引用为factorial,在f的内部可以访问到f,利用这个特点就做到了函数的调用与函数名的完全解耦合,无论将来调用方式如何变化,都不会影响执行结果:

var trueFactorial = factorial;factorial = null;console.log(trueFactorial(4));// 24

转载于:https://my.oschina.net/bob1900/blog/3036578

你可能感兴趣的文章
IEEE期刊
查看>>
pssh使用
查看>>
索引优化系列十四--啥时分区索引性能反而低
查看>>
hive的变量传递设置
查看>>
apache-shiro杂记(三) 用了apache-shiro后,HttpSession.getServletContext() API无法正常工作了...
查看>>
eclipse 中的 maven run configurations
查看>>
spring 项目中的一个异常
查看>>
CentOS PPTP ×××
查看>>
电子工程师必须知道的10个网站 !!!
查看>>
我的友情链接
查看>>
防Xss攻击,包含富文本编辑器的处理
查看>>
MyBatis延迟加载
查看>>
利用MAVEN打包可运行jar包,包括依赖的第三方包
查看>>
Java调用 shell脚本阻塞
查看>>
rabbitmy实战
查看>>
mysql-Mac终端下遇到的问题总结
查看>>
表空间迁移(二)
查看>>
准备mysql函数库和PHP文件
查看>>
初学者应该了解的编程陷阱:javascript篇
查看>>
【安全牛学习笔记】手动漏洞挖掘(三)
查看>>