博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaScript递归浅析
阅读量:4911 次
发布时间:2019-06-11

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

问题

一个简单的递归,求n的阶乘:

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

 

如果像下面这样使用它,则会出错:

var fcopy = factorial;factorial = null;alert(fcopy(3));

 

因为fcopy指向的函数实体调用了factorial,而factorial已经被释放。

解决的办法

使用arguments.callee

执行流进入函数时会创建函数的运行环境(作用域链等),包括 arguments 这个特殊对象,arguments对象有个属性指向函数本身:
arguments.callee
function factorial(n){    if (n<=1)    {        return 1;    }else{        return arguments.callee(n-1)*n;    }}

 

不过callee在严格模式下不可用。

使用函数表达式

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

 

这并非使用了什么新的技术,只是在原来概念上的一种应用,在定义 factorial 时,直接创建一个函数,再将此函数的引用赋值给factorial。

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

转载于:https://www.cnblogs.com/magma/p/4695538.html

你可能感兴趣的文章
JMeter学习笔记--使用URL回写来处理用户会话
查看>>
Error creating bean with name 'documentationPluginsBootstrapper' defined in URL
查看>>
Javascript样例之文档章节滚动全版(DOM)
查看>>
C++ 面向对象
查看>>
Maven Nexus
查看>>
js 判断滚动条的滚动方向
查看>>
关于springboot启动时候报错:springboot Failed to parse configuration class [Application]
查看>>
java中Class的使用详解
查看>>
css,js文件后面加一个版本号
查看>>
webpack第一节(2)
查看>>
python之asyncio三种应用方法
查看>>
Laravel 的文件存储 - Storage
查看>>
转:[Server] 在 Windows 上安裝 PHP 5.3 開發環境
查看>>
【IE6的疯狂之二】IE6中PNG Alpha透明(全集)
查看>>
第一个Shell脚本
查看>>
C++ 小笔记
查看>>
zabbix 安装rpm
查看>>
PhantomJS:Full web stack,No browser required
查看>>
Git远程操作详解
查看>>
java课后思考问题(七)
查看>>