普通函数和箭头函数的区别
- 语法形式不同:箭头函数使用箭头“=>”来定义函数,而普通函数使用 function 关键字定义。
function greet(name) {
console.log('Hello, ' + name + '!');
}
const greet = name => {
console.log(`Hello, ${name}!`);
};
- this 绑定不同:箭头函数的 this 值被继承自外层作用域,而不是在函数调用时确定;而普通函数的 this 值则是在函数调用时动态确定的。
const obj = {
name: 'Alice',
sayName() {
console.log(this.name);
}
};
const sayName = obj.sayName;
sayName();
const obj = {
name: 'Alice',
sayName: () => {
console.log(this.name);
}
};
const sayName = obj.sayName;
sayName();
- 不能使用 arguments 对象:箭头函数不能使用 arguments 对象来获取函数的参数列表,而是需要使用剩余参数(rest parameters)语法来获取函数的参数列表。
function sum() {
let total = 0
for (let i = 0
total += arguments[i]
}
return total
}
sum(1, 2, 3, 4)
const sum = (...args) => {
let total = 0
for (let i = 0
total += args[i]
}
return total
}
sum(1, 2, 3, 4)
- 不能使用 new 关键字调用:箭头函数不能被使用 new 关键字调用,因为它没有构造函数的行为。
function Person(name, age) {
this.name = name
this.age = age
}
const person = new Person('Alice', 25)
console.log(person.name)
console.log(person.age)
const Person = (name, age) => {
this.name = name
this.age = age
}
const person = new Person('Alice', 25)
- 不能作为生成器函数:箭头函数不能作为生成器函数(generator function),因为它们没有 iterator 和 next 方法。
function* counter() {
let i = 0;
while (true) {
yield i;
i++;
}
}
const iterator = counter();
console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
const counter = () => {
let i = 0;
while (true) {
yield i;
i++;
}
}
const iterator = counter();
- 简洁的函数体:当函数体只有一条语句时,可以省略花括号和 return 关键字。
//函数体只有一条语句,使用花括号和 return 关键字来明确指定返回值
const sum = (a, b) => a + b
//函数体有多条语句,需要使用花括号和 return 关键字来明确指定函数的返回值
const calculate = (a, b) => {
const sum = a + b
const difference = a - b
return sum * difference
}