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 页面 Mask实现代码
Jan 09 Javascript
Jquery中删除元素的实现代码
Dec 29 Javascript
页面实时更新时间的JS实例代码
Dec 18 Javascript
jQuery中toggleClass()方法用法实例
Jan 05 Javascript
jquery遍历table的tr获取td的值实现方法
May 19 Javascript
AngularJS使用拦截器实现的loading功能完整实例
May 17 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
Mar 10 Javascript
JS的函数调用栈stack size的计算方法
Jun 24 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
Oct 18 Javascript
微信小程序实现复选框效果
Dec 28 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 jQuery
浅析Vue 中的 render 函数
Feb 28 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
用Socket发送电子邮件
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
php session和cookie使用说明
2010/04/07 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
javascript Keycode对照表
2009/10/24 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
浅析Git版本控制器使用
2017/12/10 Python
python实现简易版计算器
2020/06/22 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
python线程优先级队列知识点总结
2021/02/28 Python
省优秀教师事迹材料
2014/01/30 职场文书
yy司仪主持词
2014/03/22 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
实现一个简单得数据响应系统
2021/11/11 Javascript