一道优雅面试题分析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 相关文章推荐
页面只能打开一次Cooike如何实现
Dec 04 Javascript
jQuery 获取兄弟元素的几种不错方法
May 23 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
javascript实现类似百度分享功能的方法
Jul 27 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
React Native实现简单的登录功能(推荐)
Sep 19 Javascript
简单理解Vue条件渲染
Dec 03 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
Apr 04 jQuery
js获取 gif 的帧数的代码实例
Sep 10 Javascript
vue计算属性+vue中class与style绑定(推荐)
Mar 30 Javascript
抖音短视频(douyin)去水印工具的实现代码
Mar 30 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
PHP中动态显示签名和ip原理
2007/03/28 PHP
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python 实现堆排序算法代码
2012/06/05 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python使用mysql数据库示例代码
2017/05/21 Python
Django中Model的使用方法教程
2018/03/07 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
Python如何使用字符打印照片
2020/01/03 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
Java的类与C++的类有什么不同
2014/01/18 面试题
后勤人员自我评价怎么写
2013/09/19 职场文书
化学工程专业求职信
2014/08/10 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
分居协议书范本
2014/11/03 职场文书
人事主管岗位职责
2015/02/04 职场文书
员工工作表扬信
2015/05/05 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
mysql序号rownum行号实现方式
2022/12/24 MySQL