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获取图片长和宽度的代码
Nov 24 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
Oct 11 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 Javascript
jquery子元素过滤选择器使用示例
Jun 24 Javascript
原生Js实现简易烟花爆炸效果的方法
Mar 20 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
Dec 03 Javascript
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
五步轻松实现zTree的使用
Nov 01 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
详解微信小程序开发之formId使用(模板消息)
Aug 27 Javascript
vue-cli3.X快速创建项目的方法步骤
Nov 14 Javascript
Vue实现开关按钮拖拽效果
Sep 22 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
网站上面有这种切换效果
2006/06/26 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
Python常用内置模块之xml模块(详解)
2017/05/23 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python实现两款计算器功能示例
2017/12/19 Python
python实现画圆功能
2018/01/25 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python with语句和过程抽取思想
2019/12/23 Python
python如何控制进程或者线程的个数
2020/10/16 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
大学生的自我鉴定范文
2014/01/21 职场文书
2014年文员工作总结
2014/11/18 职场文书
高中运动会广播稿
2015/08/19 职场文书
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android