大家平时写项目,经常会使用箭头函数,因为箭头函数语法简洁,非常灵活,不能作为构造函数,没有this等等
大家有没有思考过为什么需要箭头函数
因为要消除函数的二义性,二义性是指:指令序列
和构造器
1. 指令序列
指令序列就是把一个函数的指令从头到尾运行一遍
2. 构造器
构造器是用来创建一个构造函数的实例对象
因为函数的二义性会导致js函数复杂度上升,因为一个函数在创建的时候,不知道未来的使用者会如何调用,有可能会通过new调用,也可能不会,不管怎么调用都不会报错
这就是函数两个层面的意思,在一个正统语言里面,既然这两个意思不一样,那么它的语法层面是应该分开的,不能混着用,但是在js中既可以直接调用,也可以使用new关键字调用,甚至混合调用,例如
Number()
new Number()
Date()
new Date()
这两种调用方式都可以,为了区分这两种调用方式
在ES6中消除了函数的二义性,引入了类class
和箭头函数
ECMAScript 6新引入的class关键字具有正式定义类的能力,实际上它背后使用的仍然是原型和构造函数的概念,所以它就不具备指令序列的含义,当调用类时只能用new关键字调用否则会报错
想要深入了解ES6class类可以看这篇文章:ES6类class(详细介绍)
箭头函数只会表达指令序列,没有构造器这个含义,所以箭头函数不能通过new来调用,也就是说箭头函数跟所有面向对象有关的东西箭头函数都没有,
比如:new
,this
,原型
打印箭头函数的原型,输出结果是undefined
想要深入了解箭头函数可以看这篇文章:JavaScript函数详细介绍