javascript中function 函数递归的陷阱问题
//看下这个递归方法,最后输出的值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 函数递归的陷阱问题的更多相关文章
- JavaScript中Function函数与Object对象的关系
函数对象和其他内部对象的关系 除了函数对象,还有很多内部对象,比如:Object.Array.Date.RegExp.Math.Error.这些名称实际上表示一个 类型,可以通过new操作符返回一个对 ...
- Javascript中的函数(Function)与对象(Object)的关系
今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一 ...
- JavaScript中的函数表达式
在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...
- Javascript中的函数(三)
一:概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质 ...
- 深入理解JavaScript中的函数操作——《JavaScript忍者秘籍》总结
匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数.简单的 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- 前端学习 第六弹: javascript中的函数与闭包
前端学习 第六弹: javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) { ...
- JavaScript中Eval()函数的作用
这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...
- Javascript中call函数和apply函数的使用
Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...
随机推荐
- JQuery 1.8.3对IE9兼容问题getAttribute
jQuery1.8.3在IE9下attr报错问题 jQuery1.8.3在IE9中attr方法保存. 解决方案如下: r = e.getAttribute(n); 修改为: r = e.getAttr ...
- 数据库中用varbinary存储二进制数据
问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先 ...
- JAVAWEB学习
http://www.cnblogs.com/xdp-gacl/p/3744053.html JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
- How to create Web Deployment Package and install the package
Create Web Deployment Package To configure settings on the Connection tab In the Publish method drop ...
- NBUT 1535
题意:往一个塔里放数,取数,找第 k 个大的数 刚开始用 stack 做的,不知道怎样找第 k 个数 又想到用 vector ,以前用过 注释有点多吧 ...... 代码如下: #include&l ...
- 数据库优化之锁表查询 (Sql Server)
查询锁表语句 select request_session_id spid,DB_NAME(resource_database_id) databaseName, OBJECT_NAME(resour ...
- [原] XAF How to bind a stored procedure to a ListView in XAF
First, I suggest that you review the following topic to learn how to show a custom set of objects in ...
- proxyd.c
/**************************************************************************** * program: proxyd * mo ...
- Logger的等级输出
转自:http://zhidao.baidu.com/link?url=7HnNxxUei6m3X3JOLfK4yShElbu5xwvU9Z7ipBAaIvQOi3Bc30N-7o7JgfnZDEg3 ...
- linux Makefile编写的整理
最近将Makefile的编写进行了整理和提炼了一下,大致分为五个步骤: 编译总共为五个部分 1.设置编译环境 set compile environment 2.获取要编译的源文件,以及把源文件转换为 ...