一道优雅面试题分析js中fn()和return fn()的区别


Posted in Javascript onJuly 05, 2016

在js中,经常会遇到在函数里调用其它函数的情况,这时候会有 fn() 这种调用方式,还有一种是 return fn() 这种调用方式,一些初学者经常会被这两种方式给绕晕了。这里用一个优雅的面试题来分析一下两种方式的不同之处。 

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

var result = fn();
console.log(result);

这是一道隐藏了坑的面试题,看似很简单,大部分人可能想都不想就答出了10。而实际上运行可知打印出来的是 undefined。这道陷阱题很直观的体现出了前面所说的问题,当我们将执行fn的那一行修改为: 

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

var result = fn();
console.log(result);

这时,会发现打印出来的结果终于不负众望的是 10 了。

为什么这里加不加return区别会这么大? 

这里的主要原因很简单,JavaScript的函数都是有默认返回值的,如果函数结尾不写return,会默认返回undefined,这就是为什么在chrome的console控制台里,写代码经常下面会出现一行undefined的原因。 

再仔细看看这个例子,当i自增到9的时候,也就是倒数第二次递归调用fn的那一次,如果没有return,这一次执行完fn,会默认return undefined,而不会继续下一次递归了。当加上了 return,在这里则会继续最后一次递归,即i=10的时候,跳入else里面返回得到正确的10。 

说到这里,可以引申出一个更为经典的例子,著名的二分查找法: 

var mid = Math.floor((arr.length - 1) / 2);

function search(n, mid) {
 if (n > arr[mid]) {
 mid = Math.floor((mid + arr.length) / 2);
 return search(n, mid);
 } else if (n < arr[mid]) {
 mid = Math.floor((mid - 1) / 2);
 return search(n, mid);
 } else {
 return mid;
 }
}

var index = search(n, mid);
console.log(index);

二分查找法也是需要多次递归调用,很多新手在第一次实现这个算法的时候经常会犯的一个错误就是忘记在递归的函数前加上return,最后导致返回结果是undefined,这里的道理也和前面是类似的,不加return,会导致递归后,直接返回undefined,不会继续下一次递归。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
jQuery 跨域访问问题解决方法
Dec 02 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
js获取数组的最后一个元素
Apr 14 Javascript
jquery获得当前html页面源码的方法
Jul 14 Javascript
Angularjs中使用Filters详解
Mar 11 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
Aug 06 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
浅析JavaScript 函数柯里化
Sep 08 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 #Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
Jul 05 #Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 #Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 #Javascript
Node.js实现文件上传
Jul 05 #Javascript
JavaScript数组方法大全(推荐)
Jul 05 #Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 #Javascript
You might like
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
python生成随机mac地址的方法
2015/03/16 Python
python中list列表的高级函数
2016/05/17 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
详解python中asyncio模块
2018/03/03 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
大三毕业自我鉴定
2014/01/15 职场文书
论文指导教师评语
2014/04/28 职场文书
生物科学专业自荐书
2014/06/20 职场文书
学生检讨书怎么写
2014/10/09 职场文书
个人作风建设总结
2014/10/23 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
会议邀请函
2015/01/30 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
公司文体活动总结
2015/05/07 职场文书
金陵十三钗观后感
2015/06/04 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
nginx lua 操作 mysql
2022/05/15 Servers