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 解析xml文件
Aug 09 Javascript
js判断背景图片是否加载成功使用img的width实现
May 29 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
js取整数、取余数的方法
May 11 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 Javascript
浅谈JavaScript的自动垃圾收集机制
Dec 15 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
Dec 24 Javascript
浅谈Vuejs Prop基本用法
Aug 17 Javascript
总结4个方面优化Vue项目
Feb 11 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
Aug 20 Javascript
京东优选小程序的实现代码示例
Feb 25 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缓存技术介绍
2006/11/25 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
Smarty变量用法详解
2016/05/11 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
python实现FTP服务器服务的方法
2017/04/11 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
python 使用shutil复制图片的例子
2019/12/13 Python
pandas数据拼接的实现示例
2020/04/16 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
一道Delphi上机题
2012/06/04 面试题
给老师的道歉信
2014/01/11 职场文书
学期自我评价
2014/01/27 职场文书
车间机修工岗位职责
2014/02/28 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2014年学前班工作总结
2014/12/08 职场文书
毕业典礼致辞
2015/07/29 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书