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 相关文章推荐
重载toString实现JS HashMap分析
Mar 13 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
Mar 01 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
Jan 27 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
Jul 15 Javascript
vue :src 文件路径错误问题的解决方法
May 15 Javascript
Vue 组件传值几种常用方法【总结】
May 28 Javascript
详解Vue实战指南之依赖注入(provide/inject)
Nov 13 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
vue 实现LED数字时钟效果(开箱即用)
Dec 08 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 Javascript
详解小程序横屏方案对比
Jun 28 Javascript
详解React路由传参方法汇总记录
Nov 29 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中explode与split的区别介绍
2012/10/03 PHP
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
Python获取apk文件URL地址实例
2013/11/01 Python
详解Python网络爬虫功能的基本写法
2016/01/28 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
使用Python读取大文件的方法
2018/02/11 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
Reformation官网:美国女装品牌
2018/09/14 全球购物
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
为什么node.js不适合大型项目
2021/04/28 Javascript
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android