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吗?
Feb 24 Javascript
JQuery获取文本框中字符长度的代码
Sep 29 Javascript
js定时器的使用(实例讲解)
Jan 06 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
分享一些常用的jQuery动画事件和动画函数
Nov 27 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
Jun 30 Javascript
基于Vue.js实现简单搜索框
Mar 26 Javascript
在Webpack中用url-loader处理图片和字体的问题
Apr 28 Javascript
vuex实现购物车的增加减少移除
Jun 28 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
理解JavaScript中的事件
2006/09/23 Javascript
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
Python实现验证码识别
2020/06/15 Python
Python 操作 MySQL数据库
2020/09/18 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
ECHT官方网站:男女健身服
2020/02/14 全球购物
《小池塘》教学反思
2014/02/28 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
赤壁观后感(2)
2015/06/15 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript