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 相关文章推荐
用js实现的页面关键字密度查询代码
Dec 27 Javascript
映彩衣的js随笔(js图片切换效果)
Jul 31 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
基于JavaScript实现屏幕滚动效果
Jan 18 Javascript
vue实现点击图片放大效果
Aug 15 Javascript
prototype.js简单实现ajax功能示例
Oct 18 Javascript
详解vue项目首页加载速度优化
Oct 18 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
Aug 27 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
jQuery操作选中select下拉框的值代码实例
Feb 07 jQuery
数组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中操作Excel实例代码
2010/04/29 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
详谈javascript异步编程
2016/02/21 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
JS实现轮播图效果
2020/01/11 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python不规范的日期字符串处理类
2014/06/10 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
python实现PID算法及测试的例子
2019/08/08 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
工作中的自我评价如何写好
2013/10/28 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
世界遗产导游词
2015/02/13 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle