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 相关文章推荐
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
May 03 Javascript
JavaScript和JQuery实用代码片段(一)
Apr 07 Javascript
js DOM 元素ID就是全局变量
Sep 20 Javascript
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
Javascript 命名空间模式
Nov 01 Javascript
Javascript基础教程之JavaScript语法
Jan 18 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
Feb 05 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
JavaScript实现与web通信的方法详解
Aug 07 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 Javascript
Vue3.0 手写放大镜效果
Jul 25 Vue.js
数组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如何解决无法上传大于8M的文件问题
2014/03/10 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python学生管理系统开发
2019/01/30 Python
详解python的四种内置数据结构
2019/03/19 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
美国保健品专家:Life Extension
2018/05/04 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
大学毕业感言50字
2014/02/07 职场文书
大学自主招生推荐信
2014/05/10 职场文书
服装设计专业自荐信
2014/06/17 职场文书
表扬通报怎么写
2015/01/16 职场文书
天下第一关导游词
2015/02/06 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js