JS | 箭头函数和普通函数

106 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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();

运行结果:

image.png

可以看到箭头函数中的 this 获取到了外部的 msg 字段。在上面的代码中,箭头函数声明的位置是全局作用域,所以可以获取到全局作用域中的 this (指向 window)

除此之外箭头函数还有一个特点:任何方法都无法改变其指向(call() / bind() / apply() 等)

4. arguments

普通函数中,可以使用 argument 来存储传递的参数,而箭头函数是不绑定 arguments 的,

function myFunc(a){
    console.log(arguments);
}
myFunc(1);
myFunc(100,200,300);

image.png

箭头函数中使用 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 原型对象