学过其它编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的。

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

这是一个比較经典的阶乘算法。这个写法就实现我们所说的递归。这个代码看起来是没有什么问题, 在c或者其它编程语言都有这种描写叙述。可是在JavaScript中有时就会出错。

就比方:

<span style="white-space:pre">	</span>var myfac=fac;
fac=null;
console.log(myfac(4));//出错了

为什么会出错呢?
依照道理fac把原始函数引用给了myfac,然后将fac置为空,指向原始函数的引用依旧在myfac中,应该能够訪问到才对啊。这个就出现故障了,在调用myfac的时候,因为必须运行fac()。而此时fac已经不再是一个函数了,所以才会导致错误,在这种情况下使用arguments.callee(指向正在运行的函数)能够解决问题。

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

通过使用arguments.callee取代函数名,能够确保不管怎么调用函数都不会出问题。所以,在编写递归函数时。使用arguments.calllee()总比使用函数名要保险得多。

但在严格模式下,是不能够通过脚本訪问arguments.callee的,訪问这个属性会导致错误,只是能够使用命名函数表达式来达到同样的效果。

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

完辣。。。

最新文章

  1. iOS UITableViewableViewCell自适应高度
  2. html5 css3 loading 效果
  3. windows使用nginx实现网站负载均衡测试实例
  4. maxscript, 批量导出物体
  5. 2014北邮新生归来赛解题报告a-c
  6. Struts2 中遇到的问题
  7. Educational Codeforces Round 15 Road to Post Office
  8. C#自定义控件背景色透明的方法
  9. Servlet中如何实现页面转发
  10. VTK三维重建(1)-使用VTK读取DICOM,并动态输出
  11. VMWare ESX Server
  12. SQL Server自定义函数( 转载于51CTO )
  13. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第六步---炮台&amp;amp;点击炮台加入英雄&amp;amp;英雄升级
  14. jsp EL表达式和JSTL标签if-else if-else用法
  15. Are We There Yet? (zoj1745)
  16. FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
  17. rpgmakermv \c 常用颜色一览
  18. telnet总结
  19. Arcgis Runtime 100.3开发实例源代码调试日志
  20. openstack-on-centos7之环境准备

热门文章

  1. 自定义mvc验证特性,手机号号段老增加,给自定义一个RegularExpress
  2. 转:Heap spraying high addresses in 32-bit Chrome/Firefox on 64-bit Windows
  3. Good Bye 2017 部分题解
  4. 使用 Eigen 3.3.3 进行矩阵运算
  5. redis_NoSql入门概述
  6. BZOJ 1395 [Baltic2005]Trip(最短路+DP)
  7. 三周学会小程序第四讲:Heroku 绑定 Github 自动部署
  8. LinkCutTree 总结
  9. JVM堆内存的分代
  10. HashMap结构及使用