箭头函数的意义和函数的二义性
6views
谈起箭头函数,可能很多人都非常熟悉,在日常开发中可以说跟喝水一样重要。谈起与普通函数的区别,更是信手拈来:
虽然区别上多少都能罗列一些,但是为什么JS
已经有了普通函数了,为什么仍然要有箭头函数?难道只是为了一个语法简单?
答案是:为了消除函数的二义性。
我们知道,在JS
中,调用一个函数可以有以下两种方式:
不同的调用方式体现出对函数f
的不同理解,并且有着不同的调用结果,这就是函数的二义性。
因为二义性的存在,导致JS
函数的复杂度直线上升,因为在函数创建的时候,创建者无法预知其未来如何被调用,导致存在很大的安全隐患。
虽然多数情况下这种歧义可以被避免,例如
JS
命名规范中建议使用大写字母开头的函数名来表示构造函数,小写字母开头的函数名表示普通函数,使代码更易于理解和维护。但因为这并非强制要求,所以歧义仍然存在。如果你不想函数被通过
new
来调用,可以这样:
这个二义性给开发者造成严重的心智负担,官方一直知道这个问题,只是一直没有解决,后来在ES6
中引入了两个概念:
它们的作用都是为了消除函数的二义性。
箭头函数只能这样使用:
class
只能这样使用:
为什么箭头函数里没有this
和原型?
因为箭头函数跟实例无关,跟面向对象没关系,它已经脱离了面向对象的范畴,而this哪来的?this来自于面向对象里面的概念,箭头函数里面没有原型的概念是一样的。