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系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
Oct 16 Javascript
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
js解决select下拉选不中问题
Oct 14 Javascript
介绍JavaScript的一个微型模版
Jun 24 Javascript
javascript实现给定半径求出圆的面积
Jun 26 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 Javascript
简单实现node.js图片上传
Dec 18 Javascript
bootstrap IE8 兼容性处理
Mar 22 Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 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/09/30 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
PHP会话控制实例分析
2016/12/24 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
Django rest framework实现分页的示例
2018/05/24 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
如何判断计算机可能已经中马
2013/03/22 面试题
先进个人获奖感言
2014/01/24 职场文书
经理助理岗位职责
2014/03/05 职场文书
导游个人求职信
2014/04/25 职场文书
班委竞选演讲稿
2014/04/28 职场文书
企业年度评优方案
2014/06/02 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
辞职信怎么写
2015/02/27 职场文书
活动主持人开场白
2015/05/28 职场文书