//看下这个递归方法,最后输出的值function fn(i){
    i++;
    if(i<10){
        fn(i);
    }
    else{
        return i;
    }
}
var result = fn(0);
console.log(result);

大部分人都可能一下就会说出结果为10,但是真实的结果是undefined。为什么呢?因为对于每一个函数,没有写return的返回值的时候,其实对于var a = function(); 就是没有给a赋值,那么这个值就是默认的undefined值了,可以typeof a试下,返回的值为’undefined’。因此可以说就是默认一个返回值return undefined;所以我们将这个递归进行一下变形。如下:

function fn(i){
    i++;
    if(i<10){
        fn(i);
    }
    else{
        return i;
    }
  return undefined;
}
var result = fn(0);
console.log(result);

当然这个结果跟上面的结果是一样的。具体是什么原理呢?是为什么呢?看到这个if else 还有递归,你想想二叉树的先序遍历。具体在看代码。

function fn(i){
    i++;
    if(i<10){
    console.log("a:"+i);
        fn(i);
    }
    else{
    console.log("c:"+i);
        return i;
    }
  console.log("d:undefined"+i);
  return undefined;
}
var result = fn(0);
console.log(result);

输出结果:

看下二叉树的视图:

从输出的结果和二叉树的视图可以明显的看出递归的陷阱的原理了吧,很简单了,对于这个递归可以看错二叉树的先序遍历。当遍历右结点的时候,没有进行直接返回值,所以默认是undefined。当最后遍历到初始结点的时候,就返回了一个undefined。

所以这下应该明白递归的这个陷阱问题的原理了吧。当然只要我们在每个条件中都使用返回值,就会避免这个陷阱。具体代码如下:

function fn(i){
    i++;
    if(i<10){
       return fn(i);
    }
    else{
        return i;
    }
}
var result = fn(0);
console.log(result);

javascript中function 函数递归的陷阱问题的更多相关文章

  1. JavaScript中Function函数与Object对象的关系

    函数对象和其他内部对象的关系 除了函数对象,还有很多内部对象,比如:Object.Array.Date.RegExp.Math.Error.这些名称实际上表示一个 类型,可以通过new操作符返回一个对 ...

  2. Javascript中的函数(Function)与对象(Object)的关系

    今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一 ...

  3. JavaScript中的函数表达式

    在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...

  4. Javascript中的函数(三)

    一:概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质 ...

  5. 深入理解JavaScript中的函数操作——《JavaScript忍者秘籍》总结

    匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数.简单的 ...

  6. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  7. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  8. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

  9. Javascript中call函数和apply函数的使用

    Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...

随机推荐

  1. scrapy-1.2.1安装失败之解决方法

    前几天重装了win10 64位系统,安装了python-3.5,但是用pip安装scrapy模块时出现如下错误: 看起来是lxml安装的时候出错了,于是先pip install lxml,出现了和上面 ...

  2. 黑马程序员_Java基础:IO流总结

    ------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...

  3. Android ListView onItemClick Not Work

    Android ListView onItemClick Not Work ListView item中有Button和RadioButton的时候,它的Item点击事件不起作用,需要设置item的属 ...

  4. Delphi 版 MIB_IF_ROW2

    unit netioapi; interface uses Windows; type {$Z4} NDIS_MEDIUM = ( NdisMedium802_3, NdisMedium802_5, ...

  5. WPF控件经验小结:(1) ToolBar去掉右边箭头(扩展图标)

    今天开发时,同事问我一个问题.怎么去除ToolBar右边扩展图标.我想了一下,说改Style.同事说太麻烦了.可不可以快速修正.我说应该动态去读取Template模板中的Style,然后隐藏.怎么实现 ...

  6. select 取的是session里面的值时

    原来是写了一个select标签,然后用js循环取出来,发现问题是本来嵌在页面右边的页面整个弹出来, 后来改成html:optionsCollection就好了: 效果图:

  7. sql server 基础语句

    创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...

  8. [Java基础]java的main函数

    1.main函数详解 main在编程中的形式:public static void main(String[] args) { - } public : 公共的. 权限是最大,在任何情况下都可以访问. ...

  9. UNITY 状态机 + SVN + 码云 下篇

    上篇说到自己写的一个FSM状态机,这篇写怎么把代码和码云联系在一起! 首先,我们应该知道为什么使用码云? 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gi ...

  10. javascript定时函数

    setTimeout(表达式,延迟时间)是定时程序,也就是在什么时间以后干什么,只做一次,就不做了.表达式为字符串函数或其它表达式,时间单位为毫秒 例子:setTimeout("f()&qu ...