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 相关文章推荐
setInterval,setTimeout与jquery混用的问题
Apr 08 Javascript
Jquery节点遍历next与nextAll方法使用示例
Jul 22 Javascript
jquery阻止后续事件只执行第一个事件
Jul 24 Javascript
JavaScript避免内存泄露及内存管理技巧
Sep 05 Javascript
jquery得到iframe src属性值的方法
Sep 25 Javascript
JavaScript判断IE版本型号
Jul 27 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
Dec 12 Javascript
详解用vue.js和laravel实现微信支付
Jun 23 Javascript
Django使用多数据库的方法
Sep 06 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
Sep 26 Javascript
JavaScript实现贪吃蛇游戏
Jun 16 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
Smarty Foreach 使用说明
2010/03/23 PHP
php时间戳转换的示例
2014/03/31 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
数控专业毕业生求职信范文
2013/09/21 职场文书
升职自荐信
2013/11/28 职场文书
班级年度安全计划书
2014/05/01 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
个人总结怎么写
2015/02/26 职场文书
慈善募捐倡议书
2015/04/27 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书