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 相关控件的事件操作分解
Aug 03 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
JavaScript通过正则表达式实现表单验证电话号码
Mar 07 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
Oct 29 Javascript
require.js配合插件text.js实现最简单的单页应用程序
Jul 12 Javascript
微信小程序商城项目之侧栏分类效果(1)
Apr 17 Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 Javascript
简单实现jQuery轮播效果
Aug 18 jQuery
原生JavaScript实现的简单放大镜效果示例
Feb 07 Javascript
JSON数据中存在单个转义字符“\”的处理方法
Jul 11 Javascript
countup.js实现数字动态叠加效果
Oct 17 Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 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
下载文件的点击数回填
2006/10/09 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
python实现Floyd算法
2018/01/03 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
法律专业学生的自我评价
2014/02/07 职场文书
致800米运动员广播稿
2014/02/16 职场文书
文案策划求职信
2014/04/14 职场文书
三好学生评语大全
2014/12/29 职场文书
奖励通知
2015/04/22 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
婚庆司仪开场白
2015/05/29 职场文书