深入理解JavaScript 箭头函数


Posted in Javascript onMay 30, 2019

JavaScript箭头函数是ECMAScript 6中引入的编写函数表达式的一种简便方法。通常,在JavaScript中,可以通过两种方式创建函数:

  • 函数语句。
  • 函数表达式。

可以如下所示创建函数语句:

function add(num1, num2) {
var res = num1 + num2;
return res;
}
var sum = add(7, 2);
console.log(sum);

也可以创建相同功能的函数表达式,如下所示:

var add = function (num1, num2) {
var res = num1 + num2;
return res;
}
var sum = add(7, 2);
console.log(sum);

ECMA 2015(或ECMA Script 6)引入了更短的语法来编写函数表达式,称为箭头函数。使用箭头函数,你可以将上面的函数表达式编写为:

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

正如你所看到的,使用箭头函数编写的函数表达式更短。

箭头函数的基本语法规则

首先,参数应该在小括号中传递。你可以创建有两个参数的箭头函数,如下所示:

ar add = (num1, num2) => { return num1 + num2; };

如果只要传递一个参数,那么括号是可选的,可以选择忽略。你可以创建一个参数的箭头函数,如下所示:

var add = num => { return num * 10; };

如果没有参数,那么你必须要有一个空括号——不能没有。所以对于没有参数的函数,箭头函数是这样写的:

var add = () => { console.log("hey foo") };

如果函数中有单个表达式或语句:

  • 在主体中使用括号是可选的。
  • 使用return语句是可选的。

你可以重写add函数,而不使用函数体中的括号和return语句,如下所示:

var add = (num1, num2) => num1 + num2;

你也可以使用控制台语句编写不带参数的函数,如下所示:

var add = () => console.log("hey");

返回对象字面量

JavaScript箭头函数也可以返回对象字面量。唯一的要求是你需要把返回对象装入小括号中,如下所示:

var foo = (name, age) => ({
name: name,
age: age
})
var r = foo("my cat", 22);
console.log(r);

正如你所看到的那样,要返回的对象被放在了小括号内。如果你不这样做,那么JavaScript将无法区分对象字面量和函数体。

箭头函数支持rest参数

JavaScript箭头函数支持另一个ES6功能:rest参数。你可以在箭头函数中使用rest参数,如下面的代码所示:

var add = (num1, num2, ...restparam) => {
console.log(restparam.length);
var result = num1 + num2;
return result;
}
var r = add(67, 8, 90, 23);
console.log(r);

在这个例子中,当你使用带有rest参数的箭头函数时,输出会是2和75,因为传递的额外参数的数量是2,num1和num2的总和是75。

箭头功能支持默认参数

另外,JavaScript箭头函数还支持另一个ES6功能:默认参数。此处详细介绍了默认参数。你可以在箭头函数中使用默认参数,如下所示:

var add = (num1 = 9, num2 = 8) => {
var result = num1 + num2;
return result;
}
var r = add();
console.log(r);

在上面的代码中,箭头函数中有默认参数。调用该函数时,我们没有传递任何值,并且由于默认参数的存在,输出将是17。

“this”在箭头函数中如何工作?

箭头函数没有它自己的this值。箭头函数中的this值总是从封闭范围继承。在JavaScript中,每个函数都有它自己的this值,这取决于代码是如何调用函数的。请仔细看下面列出的代码:

var Cat = {
name: 'mew',
canRun: function () {
console.log(this)
var foo = () => { console.log(this) }
foo();
}
};

在这里,cat是一个对象字面量,它包括:

  • 属性名称。
  • 方法canRun。

在canRun方法中,我们创建了一个箭头函数foo,给出了this值。由于箭头函数没有它自己的this值,所以它将从周围的函数获取,因此,你将得到:

深入理解JavaScript 箭头函数

正如你所看到的,this值在canRun方法和箭头函数foo中是相同的。箭头函数从继承范围得到this值。如果你对此不甚清楚,那么请牢记以下两条规则:

  • 使用object.method在方法中获取一个有意义的对象作为this值。
  • 对于任何其他要求,使用箭头函数,由于函数没有自己的this值,所以它将继承封闭范围的this值。

使用箭头函数的限制条件

应用箭头函数时要注意的一些限制条件:

  • 箭头函数没有参数对象。
  • 箭头函数不能与新运算符一起使用,因此它不能用作构造函数。
  • 箭头函数没有原型属性。

如果你尝试使用箭头函数作为构造函数,那么你会得到异常。请看下面的代码:

var foo = (name, age) => { name = name, age = age };
var f1 = new foo("cat", 6);

代码试图通过使用箭头函数foo作为构造函数来创建对象f1,JavaScript将抛出以下异常:

深入理解JavaScript 箭头函数

而且,当你试图输出箭头函数的原型值时,你会得到undefined的输出:

var foo = (name, age) => { name = name, age = age };
console.log(foo.prototype);

发生这种情况的原因是因为箭头函数没有原型属性。请记住:虽然箭头函数为你提供了编写函数表达式的简短方法,但它没有自己的this值,也不能用作构造函数。

英文原文:Easy JavaScript Part 6 : Arrow functions in JavaScript

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
找到一点可怜的关于dojo资料,谢谢作者!
Dec 06 Javascript
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
JavaScript中自带的 reduce()方法使用示例详解
Aug 10 Javascript
深入理解jquery中extend的实现
Dec 22 Javascript
javascript 动态生成css代码的两种方法
Mar 17 Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 Javascript
vue router 用户登陆功能的实例代码
Apr 24 Javascript
详解vue父子组件关于模态框状态的绑定方案
Jun 05 Javascript
Vue.js如何使用Socket.IO的示例代码
Sep 05 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 Javascript
vue.js实现照片放大功能
Jun 23 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 Javascript
socket在egg中的使用实例代码详解
May 30 #Javascript
深入了解JavaScript 私有化
May 30 #Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 #jQuery
Vue CL3 配置路径别名详解
May 30 #Javascript
Vue CLI3中使用compass normalize的方法
May 30 #Javascript
通过实践编写优雅的JavaScript代码
May 30 #Javascript
AngularJs中$cookies简单用法分析
May 30 #Javascript
You might like
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
二级域名转向类
2006/11/09 Javascript
简单通用的JS滑动门代码
2008/12/19 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
职工代表大会主持词
2014/04/01 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB
Go 内联优化让程序员爱不释手
2022/06/21 Golang