ES6中的箭头函数实例详解


Posted in Javascript onApril 06, 2017

本文实例讲述了ES6中的箭头函数。分享给大家供大家参考,具体如下:

语法

我们先来看看箭头函数的语法:

([param] [, param]) => {
  statements
}
param => expression

param 是参数,根据参数个数不同,分这几种情况:

() => { … } // 零个参数用 () 表示;
x => { … } // 一个参数可以省略 ();
(x, y) => { … } // 多参数不能省略 ();

示例

我们再来看看一些示例,看看在ES5中的函数怎么通过ES6中的箭头函数来替代吧:

// ES5
var selected = allJobs.filter(function (job) {
 return job.isSelected();
});
// ES6
var selected = allJobs.filter(job => job.isSelected());

当然,也可以定义多个参数:

// ES5
var total = values.reduce(function (a, b) {
 return a + b;
}, 0);
// ES6
var total = values.reduce((a, b) => a + b, 0);

当然=>后面也不一定非得接return 之后的语句,看下面:

// ES5
$("#confetti-btn").click(function (event) {
 playTrumpet();
 fireConfettiCannon();
});
// ES6
$("#confetti-btn").click(event => {
 playTrumpet();
 fireConfettiCannon();
});

但是需要注意的是,多行语句需要用{}括起来,单行表达式不需要{},并且会作为函数返回值。

x => { return x * x }; // 函数返回 x * x
x => x * x; // 同上一行
x => return x * x; // SyntaxError 报错,不能省略 {}
x => { x * x }; // 合法,没有定义返回值,返回 undefined

和普通函数一样,箭头函数也可以使用剩余参数和默认参数

var func1 = (x = 1, y = 2) => x + y;
func1(); // 得到 3
var func2 = (x, ...args) => { console.log(args) };
func2(1,2,3); // 输出 [2, 3]

特性

介绍完了箭头表达式的语法和示例,我们就需要思考一下了。如果箭头表达式仅仅就是简化了函数的命名,我们为什么要改变原来的习惯而去使用它呢?所以我们需要了解一下箭头函数的特性。

箭头函数内部没有constructor方法,也没有prototype,所以不支持new操作。但是它对this的处理与一般的普通函数不一样。箭头函数的 this 始终指向函数定义时的 this,而非执行时。我们通过一个例子来理解:

var o = {
  x : 1,
  func : function() { console.log(this.x) },
  test : function() {
    setTimeout(function() {
      this.func();
    }, 100);
  }
};
o.test(); // TypeError : this.func is not a function

上面的代码会出现错误,因为this的指向从o变为了全局(函数调用中的this都是指向全局的)。如果大家对JavaScript中的this不是很熟悉的话,可以看看前面的一篇文章《javascript中this的用法实例详解》。好了,回归正题,我们需要修改上面的代码如下:

var o = {
  x : 1,
  func : function() { console.log(this.x) },
  test : function() {
    var _this = this;
    setTimeout(function() {
      _this.func();
    }, 100);
  }
};
o.test();

通过使用外部事先保存的this就行了。这里就可以利用到箭头函数了,我们刚才说过,箭头函数的 this 始终指向函数定义时的 this,而非执行时。所以我们将上面的代码修改如下:

var o = {
  x : 1,
  func : function() { console.log(this.x) },
  test : function() {
    setTimeout(() => { this.func() }, 100);
  }
};
o.test();

这回this就指向o了。

我们还需要注意一点的就是这个this是不会改变指向对象的,我们知道call和apply可以改变this的指向,但是在箭头函数中是无效的。

var x = 1,
  o = {
    x : 10,
    test : () => this.x
  };
o.test(); // 1
o.test.call(o); // 依然是1

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery 1.4 15个你应该知道的新特性(译)
Jan 24 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
Mar 06 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
跟我学习javascript的for循环和for...in循环
Nov 18 Javascript
概述BootStrap中role="form"及role作用角色
Dec 08 Javascript
node.js入门学习之url模块
Feb 25 Javascript
Vue中添加过渡效果的方法
Mar 16 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
Sep 14 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
在layui中select更改后生效的方法
Sep 05 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 #Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 #Javascript
javascript中this用法实例详解
Apr 06 #Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
Apr 06 #Javascript
js遍历获取表格内数据的方法(必看)
Apr 06 #Javascript
JS优化与惰性载入函数实例分析
Apr 06 #Javascript
大白话讲解JavaScript的Promise
Apr 06 #Javascript
You might like
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
什么是JavaScript
2009/08/13 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
简单的三步vuex入门
2018/05/20 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
简单学习Python time模块
2016/04/29 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
python爬虫之自制英汉字典
2019/06/24 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
django 取消csrf限制的实例
2020/03/13 Python
关于Python解包知识点总结
2020/05/05 Python
为什么称python为胶水语言
2020/06/16 Python
Python的collections模块真的很好用
2021/03/01 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
初中英语演讲稿
2014/04/29 职场文书
应届生找工作求职信
2014/06/24 职场文书
财务统计员岗位职责
2015/04/14 职场文书
投资申请报告
2015/05/19 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
小学总务工作总结
2015/08/13 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
车位出租协议书范本
2016/03/19 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL