区别大致有6点:
1:写法不一样
2:箭头函数不能作为构造函数使用
3:两者this的指向不同
4:箭头函数的arguments指向它的父级函数所在作用域的arguments
5:箭头函数没有new.target
6、 call()、apply()、bind()等方法不能改变箭头函数中this的指向
下边我们分别就以上六点用代码来进行说明:
1:写法不一样
//箭头函数
let fn = name => {
console.log(name)
}
//普通函数
let fn2 = function(name) {
console.log(name)
}
声明一个普通函数需要使用关键字function来完成,并且使用function既可以声明成一个具名函数也可以声明成一个匿名函数
声明一个箭头函数则只需要使用箭头就可以,无需使用关键字function,比普通函数声明更简洁。
箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名
2、箭头函数不能作为构造函数使用
由于箭头函数时没有自己的this,且this指向外层的执行环境,且不能改变指向,所以不能当做构造函数使用。
3、两者this的指向不同
箭头函数没有prototype 不会 创建自己的this, 所以它没有自己的this,它只会在自己作用域的上一层继承this。所以箭头函数中this的指向在它在定义时已经确定了,之后不会改变。
普通函数的this指向:
1、 普通函数的this指向的是它的调用者,谁调用这个this,this就指向谁,
2、如果没有调用者,那这个this就指向window
3、在严格模式下(设置“use strict”),this为undefined
4、我们可以使用call,apply,bind(ES5新增)去改变普通函数的this指向
4、箭头函数的arguments指向它的父级函数所在作用域的arguments
箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值。
普通函数:
在调用函数时,浏览器每次都会传递进两个隐含的参数:
1.函数的上下文对象 this
2.封装实参的对象 arguments
arguments 是一个类数组对象,它可以通过索引来操作数据,也可以获取长度。
arguments 代表的是实参。在调用函数时,我们所传递的实参都会在arguments 中保存。
arguments只在函数中使用
5、箭头函数没有new.target
什么是new.target
new.target允许你检测函数或构造方法是否是通过new运算符调用的,若函数或构造方法是由new调用的,则new.target属性的值指向该函数或构造函数,否则值为undefined。
普通函数调用中,new.target的值为undefined,使用new运算符调用的函数其值为函数本身,这可以用来判断一个函数是否是使用new调用的
ES6中的class类创建实例时必须使用new,new.target的值则为类定义本身
在类的继承中,new.target的值指向初始化类的类定义
箭头函数没有new.target
箭头函数不能被new执行,因为箭头函数没有this, 没有办法修改 this 的指向,所以也不可以将其作为构造函数、它也没有 prototype 对象。重点是没有prototype”
6、 call()、apply()、bind()等方法不能改变箭头函数中this的指向
箭头函数的this在声明时固定, 使用时不会变化, 因此call、apply、bind 不能改变箭头函数的this,因为箭头函数本身没有this
普通函数的this会在使用时变化,因此不存在这个问题