一道优雅面试题分析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 相关文章推荐
深入解析contentWindow, contentDocument
Jul 04 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 Javascript
jquery拖拽效果完整实例(附demo源码下载)
Jan 14 Javascript
Angular中$compile源码分析
Jan 28 Javascript
javascript cookie的简单应用
Feb 24 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
Mar 02 Javascript
原生JS简单实现ajax的方法示例
Nov 29 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
Jan 03 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
Aug 22 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
Sep 06 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读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
用python写asp详细讲解
2013/12/16 Python
Python素数检测的方法
2015/05/11 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
python的sorted用法详解
2019/06/25 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
九年级政治教学反思
2014/02/06 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
求职信格式要求
2014/05/23 职场文书
2014年就业工作总结
2014/11/26 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
小学班级管理心得体会
2016/01/07 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers