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 获取Listbox选择的值的代码
Apr 15 Javascript
我的javascript 函数链之演变
Apr 07 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
Jul 11 Javascript
JS 数字转换研究总结
Dec 26 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
jquery Ajax 全局调用封装实例详解
Jan 16 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
Jun 04 Javascript
webpack踩坑之路图片的路径与打包
Sep 05 Javascript
详解如何为你的angular app构建一个第三方库
Dec 07 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
May 02 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
Nov 12 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函数utf8转gb2312编码
2006/12/21 PHP
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python基于PycURL实现POST的方法
2015/07/25 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python实现证件照换底功能
2019/08/20 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
机械专业应届生求职信
2013/09/21 职场文书
竞聘演讲稿范文
2014/01/12 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
个人自我剖析材料
2014/09/30 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python
Python中的程序流程控制语句
2022/02/24 Python
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏