javascript ES6中箭头函数注意细节小结


Posted in Javascript onFebruary 17, 2017

前言

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

为什么叫Arrow Function?因为它的定义用的就是一个箭头:

x => x * x

上面的箭头函数相当于:

function (x) {
return x * x;
}

但箭头函数带来了些许问题,下面来一起看看吧。

关于{}

第一个问题是关于箭头函数与{}。

箭头函数,乍一看,用法似乎很简单,比如像下面这样用来给数组每一项乘以2:

const numbers = [1, 2, 3];
 const result = numbers.map(n => n * 2);
 // produces [2,4,6]

但是,如果使用不当,可能会引发意想不到的问题。比如下面,尝试为数组中每一项去产生对象字面量,看上去挺简单的map操作,还是引发了意外。

const numbers = [1, 2, 3];
 const result = numbers.map(n => { value: n });
 // produces [undefined], [undefined], [undefined]

什么原因造成的呢?

稍微分析可知,引起上面问题在于,箭头函数内部包裹在花括号之间的代码,被认为是一段独立的代码块而不是对象字面量,因此其单独执行,显然得到的结果就是一个全为undefined的数组。
于是,在这种情况下,其中的代码就必须有明确的返回语句或者用圆括号()包括对象字面量。

const result = numbers.map(n => ({ value: n }));
 // [{value: 1}, {value:2}, {value:3}]

关于this

第二个问题是关于箭头函数与this。

使用箭头函数,你可以像下面这样写代码而不用额外在局部作用域中去暂存this:

const adder = {
  sum: 0,
  add(numbers) {
   numbers.forEach(n => {
    this.sum += n;
   });
  }
 };
 adder.add([1, 2, 3]);
 // adder.sum === 6

然而,很多时候你可能会自以为是的在不经意间写错。正如下面的代码所示,this并不指向”adder”对象,而指向”adder”对象所在的作用域:

const adder = {
  sum: 0,
  add: (numbers) => { // scope here is important
   numbers.forEach(n => {
    this.sum += n;
   });
  }

 };

 adder.add([1, 2, 3]);
 // adder.sum === 0

最后请记住一点:箭头函数中的this继承自外围作用域的值,因此我们不能改变其指向。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
javascript按位非运算符的使用方法
Nov 14 Javascript
JavaScript基础重点(必看)
Jul 09 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
Sep 13 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
Feb 08 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
jQuery实现简易聊天框
Feb 08 jQuery
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 Javascript
数组Array的排序sort方法
Feb 17 #Javascript
Bootstrap BootstrapDialog使用详解
Feb 17 #Javascript
数组Array的一些方法(总结)
Feb 17 #Javascript
深入理解javascript的getTime()方法
Feb 16 #Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
Feb 16 #Javascript
js时间戳格式化成日期格式的多种方法介绍
Feb 16 #Javascript
基于JavaScript实现拖动滑块效果
Feb 16 #Javascript
You might like
php 图片上添加透明度渐变的效果
2009/06/29 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
详细分析Python垃圾回收机制
2020/07/01 Python
如何让python的运行速度得到提升
2020/07/08 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
电子信息工程专业推荐信
2014/02/14 职场文书
科技工作者先进事迹
2014/08/16 职场文书
优秀校长事迹材料
2014/12/24 职场文书
民主评议党员个人总结
2015/02/13 职场文书
道歉的话怎么说
2015/05/12 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers