开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
在 JS 中,箭头函数的写法相较于普通函数更加简洁,它的特点是没有自己的 this ,arguments,super 或 new.target 等。并且它不能用作构造函数。下面来对比一下这两种函数
1、书写形式
普通函数:
function myFunc(){}
箭头函数:
let myFunc=()=>{}
2. 构造函数
普通函数使用构造函数:
function Fruit(name,color){
this.name = name;
this.age = color;
}
let banana = new Fruit("好吃的香蕉",'yellow');
console.log(banana.name, banana.color);
但是,箭头函数不能用于构造函数,也不能使用 new
3. this 指向
一般情况下,在普通函数中,调用的对象是谁,this 就指向哪里。
而箭头函数没有 this 指向。那如果在箭头函数中使用了 this,又是否能获取到它指向的对象呢?我们来试一下。
运行如下代码:
var msg = "hello";
let myFunc = ()=>{
console.log(this.msg);
}
myFunc();
运行结果:
可以看到箭头函数中的 this 获取到了外部的 msg 字段。在上面的代码中,箭头函数声明的位置是全局作用域,所以可以获取到全局作用域中的 this (指向 window)
除此之外箭头函数还有一个特点:任何方法都无法改变其指向(call() / bind() / apply() 等)
4. arguments
普通函数中,可以使用 argument 来存储传递的参数,而箭头函数是不绑定 arguments 的,
function myFunc(a){
console.log(arguments);
}
myFunc(1);
myFunc(100,200,300);
箭头函数中使用 argument,运行后会报错:
let func1 = (a)=>{
console.log(arguments);
}
func1(100,200,300);
想要在箭头函数中获取到传入的参数,可以使用如下方式:
let func2 = (...args) => {
console.log(args);
}
func2(1,2,3,4,5);
运行结果:[ 1, 2, 3, 4, 5 ]
5. 其它不同
- 普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。
- 箭头函数没有 prototype 原型对象