es6函数之箭头函数用法实例详解


Posted in Javascript onApril 25, 2020

本文实例讲述了es6函数之箭头函数用法。分享给大家供大家参考,具体如下:

es6允许使用“箭头”(=>)定义函数。

var f = v => v
// 等同于
var f = function(v) {
 return v
}

如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

var f = () => 5
// 等同于
var f = function() {
 return 5
}

var sum = (num1, num2) => num1 + num2
// 等同于
var sum = function(num1, num2) {
 return num1 + num2
}

如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。

var sum = (num1, num2) => {return num1 + num2}

由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。

// 报错
let getTempItem = id => {id: id, name: "Temp"}
// 不报错
let getTempItem = id => ({id: id, name: "Temp"})

下面是一种特殊情况,虽然可以运行,但会得到错误的结果。

let foo = () => {a: 1}

上面代码中,原始意图是返回一个对象{a: 1},但是由于引擎认为大括号是代码块,所以执行了一行语句a: 1,这时,a可以理解为语句的标签,因此实际执行了语句是1,然后函数就结束了,没有返回值。

如果箭头函数只有一行语句,且不需要返回值,可以采用下面的写法,就不用写大括号了。

let fn = () => void doesNotReturn()

箭头函数可以与变量解构结合使用。

const full = ({first, last}) => first + ' ' + last
// 等同于
function full(person) {
 return person.first + ' ' + person.last
}

箭头函数使用表达更简洁。

const isEven = n => n % 2 === 0
const square = n => n * n

箭头函数的一个用处是简化回调函数。

// 正常函数写法
[1, 2, 3].map(function(x) {
 return x * x
})
// 箭头函数写法
[1, 2, 3].map(x => x * x)

下面是rest参数与箭头函数结合的例子。

const numbers = (...nums) => nums

numbers(1, 2, 3, 4, 5)

const headAndTail = (head, ...tail) => [head, tail]

headAndTail(1, 2, 3, 4, 5)

使用注意点

1)函数体内的this对象,就是定义所在的对象,而不是使用时所在的对象。
2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
3)不可以使用arguments对象,该对象在函数体内不存在,如果要用,可以用rest参数代替。
4)不可以使用yield命令,因此箭头函数不能用作Generator函数。

function foo () {
 setTimeout(() => {
 console.log('id: ', this.id)
 }, 100)
}

var id = 21

foo.call({id: 42})

上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到100ms后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象,所在输出的是42.

箭头函数根本没有自己的this,导致内部的this就是外层代码块的this,正是因为它没有this,所以也就不能用作构造函数。

除了this,以下三个变量在箭头函数之中也是不存在的:

arguments, super, new.target

别外,由于箭头函数没有自己的this,所以当然也就不能用call(),apply(),bind()这些方法去改变this的指向。

(function() {
 return [
 (() => this.x).bind({x: 'inner'})()
 ]
}).call({x: 'outer'})

不适用场合

由于箭头函数使得this从“动态”变成“静态”,下面两个场合不应该使用箭头函数。

第一个场合是定义函数的方法,且该方法内部包括this.

window.lives = 100
var cat = {
 lives: 9,
 jumps: () => { this.lives--; console.log(this.lives)}
}

// 99

上面代码中,cat.jumps()方法是一个箭头函数,这是错误的。调用cat.jumps()时,如果是普通函数,该方法内部的this指向cat;如果写成上面那样的箭头函数,使得this指向全局对象,因些不会得到预期结果。

第二个场合是需要动态this(事件监听)的时候,也不应该使用箭头函数。

var button = document.getElementById('press');
button.addEventListener('click', () => {
 this.classList.toggle('on');
});

上面代码运行时,点击按钮会报错,因为button的监听函数是一个箭头函数,导致里面的this就是全局对象。如果改成普通函数,this就会动态指向被点击的按钮对象。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js 单引号 传递方法
Jun 22 Javascript
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
JQuery上传插件Uploadify使用详解及错误处理
Apr 27 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
JS中Location使用详解
May 12 Javascript
详解vue过滤器在v2.0版本用法
Jun 01 Javascript
详解利用Angular实现多团队模块化SPA开发框架
Nov 27 Javascript
JavaScript实现的DOM绘制柱状图效果示例
Aug 08 Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
Oct 26 Javascript
Vant 中的Toast设置全局的延迟时间操作
Nov 04 Javascript
微信小程序实现倒计时功能
Nov 19 Javascript
es6数组之扩展运算符操作实例分析
Apr 25 #Javascript
es6函数之尾调用优化实例分析
Apr 25 #Javascript
es6函数之尾递归用法实例分析
Apr 25 #Javascript
javascript 易错知识点实例小结
Apr 25 #Javascript
javascript执行上下文、变量对象实例分析
Apr 25 #Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 #Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 #Javascript
You might like
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
php数组指针操作详解
2017/02/14 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python中异常捕获方法详解
2017/03/03 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
Python学习入门之区块链详解
2017/07/25 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
python中os.remove()用法及注意事项
2021/01/31 Python
携程英文网站:Trip.com
2017/02/07 全球购物
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
delegate与普通函数的区别
2014/01/22 面试题
十八届三中全会学习方案
2014/02/16 职场文书
yy婚礼主持词
2014/03/14 职场文书
中层干部培训方案
2014/06/16 职场文书
大学生军训感言
2015/08/01 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS