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 相关文章推荐
HTML页面如何象ASP一样接受参数
Feb 07 Javascript
javascript Keycode对照表
Oct 24 Javascript
CSS和Javascript简单复习资料
Jun 29 Javascript
jQuery中delegate和on的用法与区别详细解析
Jan 26 Javascript
JS对象与json字符串格式转换实例
Oct 28 Javascript
JavaScript ES6中export、import与export default的用法和区别
Mar 14 Javascript
js+html获取系统当前时间
Nov 10 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
微信小程序云开发之模拟后台增删改查
May 16 Javascript
小程序两种滚动公告栏的实现方法
Sep 17 Javascript
京东优选小程序的实现代码示例
Feb 25 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 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中SQL注入攻击与XSS攻击
2012/06/10 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
解放web程序员的输入验证
2006/10/06 Javascript
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
js简单时间比较的方法
2016/08/02 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
vue组件实例解析
2017/01/10 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
angularJS开发注意事项
2018/05/26 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
Python的组合模式与责任链模式编程示例
2016/02/02 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
python paramiko模块学习分享
2017/08/23 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
由面试题加深对Django的认识理解
2019/07/19 Python
django url到views参数传递的实例
2019/07/19 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
光电信息专业应届生求职信
2013/10/07 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
环保倡议书范文
2014/05/12 职场文书
2015元旦节寄语
2014/12/08 职场文书
导师工作推荐信
2015/03/27 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
浅析Python实现DFA算法
2021/06/26 Python
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL