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 相关文章推荐
用jquery和json从后台获得数据集的代码
Nov 07 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
Jun 24 Javascript
浅谈在js传递参数中含加号(+)的处理方式
Oct 11 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
解决ie img标签内存泄漏的问题
Oct 13 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
解决vue项目router切换太慢问题
Jul 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下对数组进行排序的函数
2010/08/08 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
js 事件小结 表格区别
2007/08/13 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
浅谈python jieba分词模块的基本用法
2017/11/09 Python
Python与R语言的简要对比
2017/11/14 Python
python3处理含有中文的url方法
2018/05/10 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python+tkinter实现学生管理系统
2019/08/20 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
手术室护士自我鉴定
2013/10/14 职场文书
党章学习思想汇报
2014/01/14 职场文书
军训学生自我鉴定
2014/02/12 职场文书
音乐会主持人开场白
2015/05/28 职场文书
讲座新闻稿
2015/07/18 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python