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学习笔记(十)
Jan 17 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
Jul 31 Javascript
jquery中交替点击事件toggle方法的使用示例
Dec 08 Javascript
jQuery的deferred对象详解
Nov 12 Javascript
jQuery动画与特效详解
Feb 01 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
JavaScript使用Range调色及透明度实例
Sep 25 Javascript
jQuery实现弹窗居中效果类似alert()
Feb 27 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
Angular实现的简单定时器功能示例
Dec 28 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
php 魔术函数使用说明
2010/02/21 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
php常见的魔术方法详解
2014/12/25 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
标准离婚协议书范文下载
2014/11/30 职场文书
公司的力量观后感
2015/06/05 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫