返回

技术篇 - 为何在JS中使用箭头函数?

前端

使用箭头函数的三大优点

JavaScript 中的函数可以分为普通函数和箭头函数。两者在语法和功能上有明显的差异。

提升代码简洁度

箭头函数的语法更简洁,尤其是在处理简单的任务时,比如作为回调函数传递给另一个函数。

//普通函数
const greet = function(name) {
  return "Hello, " + name;
};
// 箭头函数
const greet = name => "Hello, " + name;

保持词法作用域

在普通函数中,this的行为可能会让人难以理解和跟踪。箭头函数不存在自己的this关键字。它使用外层函数的作用域中的this关键字,这意味着你可以轻松地访问外层函数的作用域中的变量和方法。

//普通函数
const person = {
  name: "John Doe",
  greet: function() {
    return "Hello, " + this.name; //this 指向person对象
  }
};
// 箭头函数
const person = {
  name: "John Doe",
  greet: () => "Hello, " + this.name //this指向undefined
};

箭头函数作为一种语法糖

当我们看到箭头函数的前面有一个实参,以为这个实参是传递给这个箭头函数的,却发现和我们以为的是不同的,此时的箭头函数是通过这个实参来定义新的变量,这个变量跟这个实参同名,注意,此时这个实参在箭头函数中被当作一个变量。同时箭头函数的词法作用域跟之前一样,是定义箭头函数的环境,被当作变量的实参的作用域还是原来的作用域。

(x => x + 1)(1) // 2
(() => {
    var x = 1;
    return x + 1;
  })(); // 2

何时使用箭头函数?

在以下情况下,你应该使用箭头函数:

  • 当你想使用一个更简洁的语法来编写回调函数时。
//普通函数
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(function(number) {
  return number * 2;
});
// 箭头函数
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(number => number * 2);
  • 当你想使用一个保持词法作用域的函数时。
//普通函数
const person = {
  name: "John Doe",
  greet: function() {
    return "Hello, " + this.name;
  }
};
// 箭头函数
const person = {
  name: "John Doe",
  greet: () => "Hello, " + this.name
};
  • 当你想使用一个函数作为参数传递给另一个函数时。
//普通函数
setTimeout(function() {
  console.log("Hello, world!");
}, 1000);
// 箭头函数
setTimeout(() => console.log("Hello, world!"), 1000);

何时使用普通函数?

在以下情况下,你应该使用普通函数:

  • 当你想使用一个具有自己this关键字的函数时。
function Person(name) {
  this.name = name;
  this.greet = function() {
    return "Hello, " + this.name;
  };
}

const person = new Person("John Doe");
person.greet(); // "Hello, John Doe"
  • 当你想使用一个可以作为构造函数调用的函数时。
function Person(name) {
  this.name = name;
}

const person = new Person("John Doe");
console.log(person.name); // "John Doe"
  • 当你想使用一个可以被arguments对象访问的函数时。
function sum() {
  console.log(arguments);
}

sum(1, 2, 3); // "[1, 2, 3]"

对比箭头函数和普通函数

特征 箭头函数 普通函数
语法 () => {}(params) => expression function (params) { ... }
this 外层函数的this 自己的this
作用域 词法作用域 动态作用域
绑定值 绑定的值是箭头函数定义时的值 绑定的值是函数调用时的值
性能 通常情况下,性能略优于普通函数 通常情况下,性能略逊于箭头函数
用法 适合作为回调函数、作为参数传递给另一个函数等 适合作为构造函数、需要访问arguments对象等

总结

箭头函数和普通函数都是JavaScript中函数的两种形式。它们在语法、功能和用法上都有所不同。在不同的情况下,你应该根据需要选择使用哪种函数。