一文带你了解JavaScript箭头函数
admin
2024-04-24 08:34:32
0

JavaScript 箭头函数简介

与函数表达式相比,ES6 箭头函数为我们提供了一种编写更短语法的替代方法。

下面的例子定义了一个函数表达式,它返回两个数字的和:

let add = function (x, y) {
return x + y;
};

console.log(add(10, 20)); // 30
以下示例等效于上述 add() 函数表达式,但使用了箭头函数:

let add = (x, y) => x + y;

console.log(add(10, 20)); // 30;
在本例中,箭头函数有一个表达式 x + y,因此,它返回表达式的结果。

但是,如果使用块语法,则需要指定 return 关键字:

let add = (x, y) => { return x + y; };
typeof 运算符返回一个指示箭头函数类型的函数。

console.log(typeof add); // function
箭头函数也是 Function 类型的一个实例,如下例所示:

console.log(add instanceof Function); // true
带有多个参数的 JavaScript 箭头函数

如果箭头函数有两个或更多参数,则使用以下语法:

(p1, p2, …, pn) => expression;
以下表达式:

=> expression
等价于以下表达式:

=> { return expression; }
例如,要按降序对数字数组进行排序,可以使用数组对象的 sort() 方法,如下所示:

let numbers = [4,2,6];
numbers.sort(function(a,b){
return b - a;
});
console.log(numbers); // [6,4,2]
代码使用箭头函数语法更简洁:

let numbers = [4,2,6];
numbers.sort((a,b) => b - a);
console.log(numbers); // [6,4,2]
带有单个参数的 JavaScript 箭头函数

如果箭头函数采用单个参数,则使用以下语法:

(p1) => { statements }
请注意,您可以省略括号,如下所示:

p => { statements }
下面的示例使用箭头函数作为 map() 方法的参数,该方法将字符串数组转换为字符串长度数组。

let names = [‘John’, ‘Mac’, ‘Peter’];
let lengths = names.map(name => name.length);

console.log(lengths);
输出:

[ 4, 3, 5 ]
没有参数的 JavaScript 箭头函数

如果箭头函数没有参数,则需要使用括号,如下所示:

() => { statements }
例如:

let logDoc = () => console.log(window.document);
logDoc();
参数定义和箭头之间的换行符

JavaScript 不允许在参数定义和箭头函数中的箭头 (=>) 之间有换行符。

例如,以下代码会导致 SyntaxError:

let multiply = (x,y)
=> x * y;
但是,以下代码可以正常工作:

let multiply = (x,y) =>
x * y;
JavaScript 允许我们在参数之间使用换行符,如下例所示:

let multiply = (
x,
y
) =>
x * y;
箭头函数体中的语句和表达式

在 JavaScript 中,表达式的计算结果如下例所示。

10 + 20;
语句执行特定任务,例如:

if (x === y) {
console.log(‘x equals y’);
}
如果在箭头函数的主体中使用表达式,则不需要使用花括号。

let square = x => x * x;
但是,如果使用语句,则必须将其包裹在一对花括号中,如下例所示:

let except = msg => {
throw msg;
};
JavaScript 箭头函数和对象字面量

考虑以下示例:

let setColor = function (color) {
return {value: color}
};

let backgroundColor = setColor(‘Red’);
console.log(backgroundColor.value); // “Red”
setColor() 函数表达式返回一个将 value 属性设置为 color 参数的对象。

如果使用以下语法从箭头函数返回对象字面量,则会出现错误。

p => {object:literal}
例如,以下代码会导致错误。

let setColor = color => {value: color };
由于块字面量和对象字面量都使用大括号,因此 JavaScript 引擎无法区分块和对象。

要解决此问题,需要将对象字面量括在括号中,如下所示:

let setColor = color => ({value: color });
箭头函数对比常规功能

箭头函数和常规函数之间有两个主要区别。

首先,在箭头函数中,this、arguments、super、new.target 是词法的。这意味着箭头函数使用封闭词法范围中的这些变量(或构造)。

其次,箭头函数不能用作函数构造函数,如果你使用 new 关键字从箭头函数创建一个新对象,你会得到一个错误。

JavaScript 箭头函数和 this 值

在 JavaScript 中,一个新函数定义了它自己的 this 值。但是,箭头函数并非如此。请参见以下示例:

function Car() {
this.speed = 0;

this.speedUp = function (speed) {this.speed = speed;setTimeout(function () {console.log(this.speed); // undefined}, 1000);};

}

let car = new Car();
car.speedUp(50);
在 setTimeout() 函数的匿名函数内部, this.speed 是未定义的。原因是匿名函数的 this 隐藏了 speedUp() 方法的 this。

要解决此问题,请将 this 值分配给不会在匿名函数内隐藏的变量,如下所示:

function Car() {
this.speed = 0;

this.speedUp = function (speed) {this.speed = speed;let self = this;setTimeout(function () {console.log(self.speed);}, 1000);};

}

let car = new Car();
car.speedUp(50); // 50;
与匿名函数不同,箭头函数捕获封闭上下文的 this 值,而不是创建自己的 this 上下文。以下代码应按预期工作:

function Car() {
this.speed = 0;

this.speedUp = function (speed) {this.speed = speed;setTimeout(() => console.log(this.speed),1000);};

}

let car = new Car();
car.speedUp(50); // 50;
JavaScript 箭头函数和参数对象

箭头函数没有 arguments 对象。例如:

function show() {
return x => x + arguments[0];
}

let display = show(10, 20);
let result = display(5);
console.log(result); // 15
showMe() 函数内的箭头函数引用 arguments 对象。然而,这个 arguments 对象属于 show() 函数,而不是箭头函数。

此外,箭头函数没有 new.target 关键字。

JavaScript 箭头函数和原型属性

当使用 function 关键字定义函数时,该函数有一个称为原型的属性:

function dump( message ) {
console.log(message);
}
console.log(dump.hasOwnProperty(‘prototype’)); // true
然而,箭头函数没有原型属性:

let dump = message => console.log(message);
console.log(dump.hasOwnProperty(‘prototype’)); // false
将箭头函数用于回调和闭包是一种很好的做法,因为箭头函数的语法更简洁。

总结

使用 (…args) => 表达式;定义箭头函数。

使用 (…args) => { statements } 定义具有多个语句的箭头函数。

箭头函数没有绑定到 this 或 super。

箭头函数没有参数对象、new.target 关键字和原型属性。

相关内容

热门资讯

免费交友聊天软件推荐 2026... 如今社交节奏日益加快,人与人之间的真实互动却在悄然减少。许多人渴望一个轻松、低门槛的线上交流空间,既...
英语单词跟读软件推荐|高效提升... 在家自学英语时,高效记忆单词离不开科学的发音训练与跟读练习。以下几款专注英语单词跟读的学习类应用,均...
实用的飞机App推荐 2026... 飞机作为高效快捷的交通方式,虽能大幅缩短旅途时间,但航班延误、取消等突发状况频发,旅客往往抵达机场后...
汽车配件APP推荐 2026高... 私家车主日常保养爱车、汽修门店批量采购配件,都离不开专业可靠的汽车配件选购工具。针对安卓用户,市面上...
写小说软件推荐 人气高且好用的... 专为移动端优化的小说创作工具,能够高效满足网络文学作者及业余写作爱好者的多样化需求。这类应用支持碎片...
短视频APP排名汇总 2026... 挑选适合安卓手机的短视频应用时,用户普遍关注设备兼容性、内容质量以及操作流畅度等核心体验。在众多选择...
好用的飞机App安卓下载推荐 ... 对于长途旅行或跨境出行,飞机无疑是效率最高、覆盖最广的交通方式。然而,购票流程繁琐、值机手续复杂等问...
酒店预订哪个软件便宜 2026... 旅行前做好酒店预订,是保障旅途舒适度的重要环节。除了规划行程路线,提前锁定性价比高的住宿,能让返程后...
二手手表交易平台App推荐 2... 当前市场上,不少钟表爱好者手中积攒了多款品质优良的二手名表,有意向转手变现或寻找心仪新款。此时选择一...
不休的勇士刺客怎么玩 不休的勇... 不休的勇士刺客怎么玩?万灵大陆光影交错,刺客这个职业,一直都挺神秘的,他们不像战士那样直接冲锋,也不...