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 读后台cookie代码
Sep 15 Javascript
javascript 定义初始化数组函数
Sep 07 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
js获取时间并实现字符串和时间戳之间的转换
Jan 05 Javascript
最全的Javascript编码规范(推荐)
Jun 22 Javascript
js 调用百度分享功能
Feb 27 Javascript
微信小程序 本地图片按照屏幕尺寸处理
Aug 04 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
vue中的router-view组件的使用教程
Oct 23 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
php实现的ping端口函数实例
2014/11/12 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
私有程序集与共享程序集有什么区别
2013/04/05 面试题
水果超市创业计划书
2014/01/27 职场文书
房地产财务管理制度
2014/02/02 职场文书
人代会标语
2014/06/30 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
MySQL 计算连续登录天数
2022/05/11 MySQL
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL