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 相关文章推荐
js常见表单应用技巧
Jan 09 Javascript
解析JavaScript中点号“.”的多义性
Dec 02 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
jstree的简单实例
Dec 01 Javascript
layui分页效果实现代码
May 19 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
JS实现的汉字与Unicode码相互转化功能分析
May 25 Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 Javascript
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
关于Javascript闭包与应用的详解
Apr 22 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中jpgraph类库的使用介绍
2013/08/08 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
js实现密码强度检验
2017/01/15 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
JavaScript中的几种继承方法示例
2020/12/06 Javascript
Python在Console下显示文本进度条的方法
2016/02/14 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
北承题目(C++)
2012/05/16 面试题
转让协议书范本
2014/04/15 职场文书
房屋买卖协议样本
2014/11/16 职场文书
专家推荐信范文
2015/03/26 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
一文搞懂Python Sklearn库使用
2021/08/23 Python