一、定义的形式不同:
箭头函数带箭头,普通函数不带
二、箭头函数全都是匿名函数:
普通函数可以有匿名函数,也可以有具名函数。
let fn= ()=>{ //箭头函数定义
}
function fn1(){//普通函数定义方式
}
//或
let fn2=function(){
}
三、箭头函数中this的指向不同:
let obj={
classA:classA,
classB:classB
}
function classA(){
function subclassA(){
console.log(this)
}
subclass();
}
function classB(){
let subclassB = ()=>{
console.log(this)
}
subclass();
}
obj.classA();//Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
obj.classB();//{classA: ƒ, classB: ƒ}也就是obj
普通函数的this指向调用者,箭头函数的 this 永远指向其上下文的 this,如上面代码没有为subclassA指定调用者,它就默认指向了window,而subclassB则指向其上下文 。而且任何方法都改变不了箭头函数this指向,如 call() , bind() , apply()
四、箭头函数不具有prototype属性
function Foo(){}
let Foo2=()=>{}
let Foo3=function(){}
console.log(Foo.prototype)//{constructor: ƒ}
console.log(Foo2.prototype)//undefined
console.log(Foo3.prototype)//{constructor: ƒ}
五、箭头函数不能用于构造函数:
也就是箭头函数不能被new。为什么呢?下面我们来看一下new一个函数的过程
function Foo(){};
var f = new Foo();
这个过程等同于
function Foo(){}
var f = new Object(); // 新建一个对象
f.__proto__ = Foo.prototype;// 使该构造函数的隐式原形等于实例函数的显示原形
Foo.call(f); // 使用call方法调用函数并且指定上下文的'this
由上面一条两条
1、任何方法都改变不了其指向,如 call() , bind() , apply()
所以无法使用call方法调用函数并且指定上下文的this。
2、箭头函数不具有prototype属性,新建的对象的隐式原型无法被指定为箭头函数的原型
六、箭头函数不能Generator函数:
七、箭头函数不具有arguments对象: