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功能函数代码
Jun 23 Javascript
javascript 寻找错误方法整理
Jun 15 Javascript
字符串反转_JavaScript
Apr 28 Javascript
前端jquery部分很精彩
May 03 Javascript
BootStrap入门教程(三)之响应式原理
Sep 19 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
基于bootstrap实现收缩导航条
Mar 17 Javascript
vue.js声明式渲染和条件与循环基础知识
Jul 31 Javascript
原生js实现form表单序列化的方法
Aug 02 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
Jun 18 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 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
ThinkPHP文件上传实例教程
2014/08/22 PHP
php实现短信发送代码
2015/07/05 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
jQuery 白痴级入门教程
2009/11/11 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
Python格式化日期时间操作示例
2018/06/28 Python
pandas 时间格式转换的实现
2019/07/06 Python
python+django+rest框架配置创建方法
2019/08/31 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
计算机应用专业毕业生求职信
2013/10/24 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
2015年安全月活动总结
2015/03/26 职场文书
Python实现为PDF去除水印的示例代码
2022/04/03 Python
Go语言入门exec的基本使用
2022/05/20 Golang
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript