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之拖拽插件实现代码
Apr 14 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
Nov 16 Javascript
微信小程序 template模板详解及实例代码
Mar 09 Javascript
微信小程序movable view移动图片和双指缩放实例代码
Aug 08 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
Koa代理Http请求的示例代码
Oct 10 Javascript
React Hooks的深入理解与使用
Nov 12 Javascript
node实现简单的增删改查接口实例代码
Aug 22 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 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查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
js 判断 enter 事件
2009/02/12 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
js打造数组转json函数
2015/01/14 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
python中sets模块的用法实例
2014/09/30 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
高中生班主任评语
2014/04/25 职场文书
十岁生日答谢词
2015/01/05 职场文书
2022微信温控新功能上线
2022/05/09 数码科技