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 相关文章推荐
拖动布局之保存布局页面cookies篇
Oct 29 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
Jun 27 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
JavaScript中合并数组的N种方法
Sep 16 Javascript
深入分析jquery解析json数据
Dec 09 Javascript
很棒的js Tab选项卡切换效果
Aug 30 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 Javascript
详解js几个绕不开的事件兼容写法
Aug 30 Javascript
你可能不知道的CORS跨域资源共享
Mar 13 Javascript
js实现固定区域内的不重叠随机圆
Oct 24 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
Oct 19 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 discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python实现的密码强度检测器示例
2017/08/23 Python
matplotlib实现区域颜色填充
2019/03/18 Python
python异常触发及自定义异常类解析
2019/08/06 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
Django如何使用redis作为缓存
2020/05/21 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
人事专员岗位说明书
2014/07/29 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
倡议书怎么写?
2019/04/11 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL