在es6中,使用箭头(=>)定义函数,用起来非常的方便,但是它并非能全部取代传统函数,因为它和传统函数存在很多差异性的。具体的集中在以下几个方面:
1. 没有this, super, arguments和new.target绑定 箭头函数中的this, super, arguments以及new.target这些值由外围最近一层非箭头函数来决定的 2. 不能通过new关键字调用
箭头函数没有[[Construct]]方法,所以不能用作构造函数,如果通过new关键字调用箭头函数,程序会抛出错误
3. 没有原型
由于不可以通过new关键字调用箭头函数,所以箭头函数不存在prototype这个属性
4. 不可以改变this的绑定
函数内部的this值不可以被改变,在函数的生命周期内保持一致
5. 不支持arguments对象
6. 不支持重复的命名参数
错误使用场景:
箭头函数像一把双刃剑,它设计的初衷是“即用即弃”,秉承这一原则,它没有[[Construct]]方法,缺少传统函数中的prototype属性,因为箭头函数是定义一个构造函数的。
在这里顺便回顾以下new关键字的执行过程
1\. 创建出一个空对象
2\. 空对象内部创建this, 并将__proto__属性指向构造函数的
prototype. newObj.__proto__ = fn.prototype
3\. 返回对象
可以看出在第2步的时候,箭头函数就已经不满足了,程序自然就会抛出错误
场景二: this关联错误
箭头函数中的this由外围最近一层非箭头函数来决定的
const Fn1 = function(){ this.root = 1}
Fn1.prototype.insert1 = () => {
console.log(this.root) // undefined
}
Fn1.prototype.insert2 = () => {
console.log(this.root) //1
}