JavaScript中普通函数和箭头函数的区别


根据MDN文档,箭头函数表达式是普通函数表达式的一种语法上更简洁的替代方案,但它没有自己的`this`、`arguments`、`super`或`new.target`关键字绑定。箭头函数表达式不适合用作方法,也不能用作构造函数。

JavaScript中普通函数和箭头函数有三个细微的区别。

没有自己的`this`绑定

箭头函数没有自己的`this`值。箭头函数内部的`this`值总是继承自封闭作用域。

示例

this.a = 100;
let arrowFunc = () => {this.a = 150};
function regFunc() {
   this.a = 200;
}
console.log(this.a)
arrowFunc()
console.log(this.a)
regFunc()
console.log(this.a)

输出

100
150
150

可以看到,箭头函数改变了其作用域之外的`this`对象。普通函数只在其自身的`this`内部进行了更改。

箭头函数没有`arguments`数组

在JS中,函数中的`arguments`数组是一个特殊的对象,可以用来获取传递给函数的所有参数。与之类似,箭头函数没有自己对`arguments`对象的绑定,它们绑定到封闭作用域的参数。

箭头函数是可调用的,但不可构造的

如果一个函数是可构造的,它可以用`new`调用,例如`new User()`。如果一个函数是可调用的,它可以不用`new`调用(即普通函数调用)。

通过函数声明/表达式创建的函数既可构造又可调用。

箭头函数(和方法)仅可调用。类构造函数仅可构造。

如果您尝试调用不可调用的函数或构造不可构造的函数,将会得到运行时错误。

let arrowFunc = () => {}
new arrowFunc()
This code gives the error:
arrowFunc is not a constructor

更新于:2019年9月16日

672 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告