📜  将传统函数与箭头函数进行比较 - Javascript (1)

📅  最后修改于: 2023-12-03 15:25:16.246000             🧑  作者: Mango

将传统函数与箭头函数进行比较 - Javascript

在Javascript中,函数是一等公民,这意味着函数可以作为参数传递给其他函数,也可以从函数中返回。Javascript中有两种定义函数的方式:传统函数和箭头函数。

传统函数

传统函数使用关键字function来定义。它们可以有任意数量的参数,并且可以有一个返回值。以下是一个传统函数的基本结构:

function functionName(param1, param2, ...) {
  // 函数体
  return value;
}
传统函数的优点
  • 确定的this关键字:传统函数中的this关键字是在调用时确定的,它的值取决于调用函数的方式。
const obj = {
  name: 'John',
  printName() {
    console.log(this.name);
  }
};

obj.printName(); // "John"
const print = obj.printName;
print(); // undefined

在这个例子中,当我们直接调用对象的printName函数时,this关键字指向了obj对象,所以它打印了名字。但是当我们将printName函数分配给一个变量并调用它时,this关键字的值是未定义的,因此它输出undefined

  • 构造函数:传统函数可以用作构造函数,它们可以使用new关键字来创建一个新的对象。
function Person(name, age) {
  this.name = name;
  this.age = age;
}

const john = new Person('John', 30);
console.log(john); // { name: 'John', age: 30 }

在这个例子中,我们使用new关键字创建了一个名为john的新对象,并将其传递给Person构造函数。Person函数将在新对象上设置nameage属性,最后返回john对象。

传统函数的缺点
  • 语法冗长:传统函数需要使用关键字function来定义,这使得函数的定义变得冗长。
箭头函数

箭头函数引入了一种新的函数定义方式,可以使用=>符号来定义函数。箭头函数的语法更简洁,并且它们具有一些不同的行为,与传统函数有一些区别。以下是箭头函数的基本结构:

(param1, param2, ...) => {
  // 函数体
  return value;
}
箭头函数的优点
  • 简洁的语法:箭头函数使用更简洁的语法来定义函数,它不需要使用关键字function,这样可以减少代码中的噪音。
const sum = (a, b) => a + b;

在这个例子中,我们定义了一个名为sum的函数,它使用箭头函数语法来返回参数ab的和。

  • 确定的this关键字:箭头函数中的this关键字是在定义函数时确定的,它的值与定义函数时所在的上下文有关,而不是调用时的上下文。
const obj = {
  name: 'John',
  printName: function() {
    setTimeout(() => {
      console.log(this.name);
    }, 100);
  }
};

obj.printName(); // "John"

在这个例子中,当我们调用obj.printName()时,它会设置一个定时器来打印this.name的值。由于我们在箭头函数中使用了this.name,它的价值等于printName函数定义时的this值,即obj对象。

箭头函数的缺点
  • 不能用作构造函数:箭头函数不能用作构造函数,它们不能使用new关键字来创建对象。
const Person = (name, age) => {
  this.name = name;
  this.age = age;
};

const john = new Person('John', 30); // 抛出 TypeError

在这个例子中,我们试图创建一个名为john的新对象,并将其传递给一个名为Person的箭头函数。但是,由于箭头函数不能用作构造函数,我们不能使用new关键字来创建一个新对象,这会导致一个类型错误。

总结

传统函数和箭头函数都有它们的优点和缺点。传统函数更灵活,可以用作构造函数,并且提供确定的this关键字。另一方面,箭头函数更加简洁,并且提供确定的this关键字,但不能用作构造函数。当使用函数时,需要根据具体情况权衡并选择哪种函数定义方式。