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 相关文章推荐
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
jquery插件validate验证的小例子
May 08 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
关于JavaScript作用域你想知道的一切
Feb 04 Javascript
纯JS代码实现隔行变色鼠标移入高亮
Nov 23 Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
Vue之Vue.set动态新增对象属性方法
Feb 23 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
Dec 14 Javascript
详解如何使用微信小程序云函数发送短信验证码
Mar 13 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
jQuery 操作XML入门
2008/12/25 Javascript
一些mootools的学习资源
2010/02/07 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
JS实现轮播图效果
2020/01/11 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
在CMD命令行中运行python脚本的方法
2018/05/12 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
Python模块相关知识点小结
2020/03/09 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
大学生个人自我鉴定
2013/12/03 职场文书
企业厂长岗位职责
2013/12/17 职场文书
农村党支部先进事迹
2014/01/14 职场文书
质量管理标语
2014/06/12 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
2016年端午节寄语
2015/12/04 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书