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 相关文章推荐
filemanage功能中用到的lib.js
Apr 08 Javascript
!DOCTYPE声明对JavaScript的影响分析
Apr 12 Javascript
javascript new fun的执行过程
Aug 05 Javascript
客户端限制只能上传jpg格式图片的js代码
Dec 09 Javascript
jquery一句话全选/取消全选
Mar 01 Javascript
Javascript this 函数深入详解
Dec 13 Javascript
Node.js 中exports 和 module.exports 的区别
Mar 14 Javascript
boostrap模态框二次弹出清空原有内容的方法
Aug 10 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 Javascript
vue中使用GraphQL的实例代码
Nov 04 Javascript
vue 实现动态路由的方法
Jul 06 Javascript
Vue监视数据的原理详解
Feb 24 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
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php数组键名技巧小结
2015/02/17 PHP
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Python实现AI换脸功能
2020/04/10 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
名企HR怎样看待求职信
2014/02/23 职场文书
商场周年庆活动方案
2014/08/19 职场文书
银行奉献演讲稿
2014/09/16 职场文书
英语感谢信范文
2015/01/20 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android