深入理解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 相关文章推荐
js获取浏览器的可视区域尺寸的实现代码
Nov 30 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
点击button获取text内容并改变样式的js实现
Sep 09 Javascript
JavaScript中定义函数的三种方法
Mar 12 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
Apr 01 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
VUE使用vuex解决模块间传值问题的方法
Jun 01 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
仿京东快报向上滚动的实例
Dec 13 Javascript
通过JS运行机制的角度说说作用域
Mar 12 Javascript
js实现文字头像的生成代码
Mar 07 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下mysql数据库操作类(改自discuz)
2010/07/03 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
js密码强度校验
2015/11/10 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
为什么要用EJB
2014/04/17 面试题
家长会欢迎标语
2014/06/24 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
2015年教师国培感言
2015/08/01 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书