①一般的通过名字调用自身

  1. function sum(num){
  2. if(num<=1){
  3. return 1;
  4. }else{
  5. return num+sum(num-1);
  6. }
  7. }
  8.  
  9. console.log(sum(5));//

这种通过函数名字调用自身的方式存在一个问题:函数的名字是一个指向函数对象的指针,如果我们把函数的名字与函数对象本身的指向关系断开,这种方式运行时将出现错误。

  1. function sum(num){
  2. if(num<=1){
  3. return 1;
  4. }else{
  5. return num+sum(num-1);
  6. }
  7. }
  8. console.log(sum(5));//
  9.  
  10. var sumAnother=sum;
  11. console.log(sumAnother(5));//
  12.  
  13. sum=null;
  14. console.log(sumAnother(5));//Uncaught TypeError: sum is not a function(…)

②通过arguments.callee调用函数自身

  1. function sum(num){
  2. if(num<=1){
  3. return 1;
  4. }else{
  5. return num+arguments.callee(num-1);
  6. }
  7. }
  8. console.log(sum(5));//
  9.  
  10. var sumAnother=sum;
  11. console.log(sumAnother(5));//
  12.  
  13. sum=null;
  14. console.log(sumAnother(5));//

这种方式很好的解决了函数名指向变更时导致递归调用时找不到自身的问题。但是这种方式也不是很完美,因为在严格模式下是禁止使用arguments.callee的。

  1. function sum(num){
  2. 'use strict'
  3.  
  4. if(num<=1){
  5. return 1;
  6. }else{
  7. return num+arguments.callee(num-1);
  8. }
  9. }
  10. console.log(sum(5));//Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them(…)

③通过函数命名表达式来实现arguments.callee的效果。

  1. var sum=(function f(num){
  2. 'use strict'
  3.  
  4. if(num<=1){
  5. return 1;
  6. }else{
  7. return num+f(num-1);
  8. }
  9. });
  10.  
  11. console.log(sum(5));//
  12.  
  13. var sumAnother=sum;
  14. console.log(sumAnother(5));//
  15.  
  16. sum=null;
  17. console.log(sumAnother(5));//

这种方式在严格模式先和非严格模式下都可以正常运行。

Javascript学习笔记:3种递归函数中调用自身的写法的更多相关文章

  1. 转载——JavaScript学习笔记:取数组中最大值和最小值

    转载自:http://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html. 取数组中最大值 可以先把思路 ...

  2. JavaScript:学习笔记(1)——在HTML中使用JS

    在HTML中使用JavaScript <script>元素 1.直接在网页中嵌入JS代码 说明: 请不要在代码的任何地方出现</script>字符串 这是由于解析嵌入式代码的规 ...

  3. javascript学习笔记-2:jQuery中$("xx")返回值探究

    最近在写一个jQuery插件的时候,需要用到一个条件: 一组img标签,每一个元素都需要被它前面的元素值src替换,如果是第一个(序列为0)则其值为最后一个元素值,如果是最后一个,那么其值为第一个元素 ...

  4. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  5. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  6. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  8. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  9. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

随机推荐

  1. SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色 SP2-0611: 启用 STATISTICS 报告时出错

    援引: SP2-0618: 无法找到会话标识符.启用检查 PLUSTRACE 角色 SP2-0611: 启用 STATISTICS 报告时出错 问题描述及解决方法: SQL*Plus: Release ...

  2. 【进展】LL谱面存储方式的改善

    今天得某位高人相助,获得了一堆LL里面的标准谱面文件,是json格式的.于是折腾了一下午加一晚上,总算让SLP正确解析了json格式的谱面.

  3. centos7 开启防火墙端口 firewalld

    systemctl start firewalld firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd -- ...

  4. java List<Item> its=new ArrayList<Item>(); Map按value中的某字段排序

    public List<Item> getAllItem(){ Map<Long, Item> itemDic = new HashMap<Long, Item>( ...

  5. php 截取代码方法(140个字后的。)

    //截取摘要public static function mbsubstr($str){    $strleng = mb_strlen($str,"utf8");    $mbs ...

  6. 。。。欢乐捕鱼App WeX5 连接打包代理服务失败,请检查代理服务地址是否正确。。。

    今天学习了WeX5,第一次使用,使用它打包一个Web App 欢乐捕鱼的时候,在最终打包生成Native App的时候突然报错了,说:"连接打包代理服务失败,请检查代理服务地址是否正确&qu ...

  7. windows批处理的介绍

    扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件. 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命 ...

  8. chkconfig命令详解

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  9. ftp unable to fetch some archives,maybe run apt-get update or try with -- fix-missing?

    引用:http://bbs.csdn.net/topics/340061850 先 apt-get update 再执行安装

  10. css2 [lang|=en] 误区

    [lang|=en] w3c说明:css2选择器,选择以en开头的的lang属性. w3c的这个解释是有误区的,en开头,但是en后面必须要有-,也就是说是选择的是en-开头