JavaScript中的普通函数和箭头函数的区别和用法详解


Posted in Javascript onMarch 21, 2017

最近被问到了一个问题:

javaScript 中的箭头函数 ( => ) 和普通函数 ( function ) 有什么区别?

我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答……

箭头函数中的 this 和调用时的上下文无关,而是取决于定义时的上下文

这并不是很正确的答案……虽然也不是完全错误

箭头函数中的 this

首先说我的回答中没有错误的部分:箭头函数中的 this 确实和调用时的上下文无关

function make () {
  return ()=>{
    console.log(this);
  }
}
const testFunc = make.call({ name:'foo' });
testFunc(); //=> { name:'foo' }
testFunc.call({ name:'bar' }); //=> { name:'foo' }

这个例子可以看到,确实箭头函数在定义之后,this 就不会发生改变了,无论用什么样的方式调用它,this 都不会改变;

但严格来说,这并不是“取决于定义时的上下文”, 因为箭头函数根本就没有绑定自己的 this,在箭头函数中调用 this 时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用罢了;
从效果上看,这和我之前的理解并没有多大偏差,但它们的本质却是截然不同,箭头函数并不是普通函数新增了 this 不受调用时上下文影响的特性,而是减少了很多特性;

箭头函数其实是更简单的函数

实际上箭头函数中并不只是 this 和普通函数有所不同,箭头函数中没有任何像 this 这样自动绑定的局部变量,包括:this,arguments,super(ES6),new.target(ES6)……

借用别人的一个例子:

function foo() {
  setTimeout( () => {
   console.log("args:", arguments);
  },100);
}
foo( 2, 4, 6, 8 );
// args: [2, 4, 6, 8]

在普通函数中,会自动绑定上的各种局部变量,箭头函数都是十分单纯的沿着作用域链向上寻找……

箭头函数就是这么个简单、纯粹的东西;

所以我个人认为箭头函数更适合函数式编程,除了它更短以外,使用箭头函数也更难被那些没有显示声明的变量影响,导致你产生意料之外的计算结果;

那么普通函数能否实现和箭头函数一样的效果呢?

如果是像当初的我一样简单的考虑固定住 this 这个易变的家伙……那倒是很简单,有些常用的方法,比如这样:

function make () {
  var self = this;
  return function () {
    console.log(self);
  }
}

或者

function make () {
  return function () {
    console.log(this);
  }.bind(this);
}

然而第二种方法只能固定 this 这一个变量而已,如前文所述,箭头函数中的 arguments 等变量也是从作用域链中寻找的,为了实现类似的效果,我们只有重新定义一个局部变量这一种方式,而 babel 也是使用这种方式对箭头函数进行处理的。

function make () {
  return ()=>{
    console.log(this);
    console.log(arguments);
  }
}
//babel it...
function make() {
  var _this = this,
    _arguments = arguments;
  return function () {
    console.log(_this);
    console.log(_arguments);
  };
}

那么……如果我想在箭头函数中使用 arguments 该怎么办?

……我觉得如果你有这个需求,可能还是用普通函数更合适一点……

但并不是说在箭头函数中无法以类似数组的形式取到所有参数,我们可以利用展开运算符来接收参数,比如这样:

const testFunc = (...args)=>{
  console.log(args) //数组形式输出参数
}

或许真的有场景需要用到这种写法,但我还是认为,箭头函数更适合那些接受固定的参数,返回一个计算结果的简单情况;

以上所述是小编给大家介绍的JavaScript中的普通函数和箭头函数的区别和用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
使用js判断控件是否获得焦点
Jan 03 Javascript
jQuery实现可用于博客的动态滑动菜单
Mar 09 Javascript
由ReactJS的Hello world说开来
Jul 02 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
Oct 01 Javascript
javascript中的 object 和 function小结
Aug 14 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
ReactNative页面跳转实例代码
Sep 27 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
Aug 25 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
10种JavaScript最常见的错误(小结)
Jun 21 Javascript
ES6中异步对象Promise用法详解
Jul 31 Javascript
JavaScript 中 apply 、call 的详解
Mar 21 #Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 #Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 #Javascript
Bootstrap标签页(Tab)插件使用方法
Mar 21 #Javascript
JavaScript数组和对象的复制
Mar 21 #Javascript
Vue响应式添加、修改数组和对象的值
Mar 20 #Javascript
zTree实现节点修改的实时刷新功能
Mar 20 #Javascript
You might like
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
python通过yield实现数组全排列的方法
2015/03/18 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
小学英语教学反思
2014/01/30 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python