一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
前情提要
起初对于箭头函数而言没有什么疑问,都知道它没有自己的this,不能作为构造函数,没有原型,不能使用yiled关键字等。但是当一次面试中面试官问了我一句:箭头函数为什么没有this时,我懵了。之前从未想过箭头函数为什么没有this,当时差点脱口而出说这就是官方规定的呀,哈哈哈,但是感觉绝对不是这个答案,于是这个问题就被深深印在了我的脑海里。
于是游走在各个网站查找答案,但几乎全网都是讲箭头函数是什么样子的,怎么用,有什么特性等等
关于箭头函数为什么没有this
因为箭头函数没有[[Constructor]]
内部方法槽。
什么是普通函数
普通函数:是一个支持[[Call]]、[[Construct]]内部方法的对象。每个支持[[Construct]]的对象必须支持[[Call]],由此每个构造函数必须是一个函数对象。
普通函数分为三大特性:
- 方法特性
- 对象特性
- 自有属性
- 自定义属性
- 类的特性
方法特性
所谓方法特性指的是执行花括号里面代码
对象特性 之 自有属性
- coustruct: 构造方法
- arguments:接受实参,返回一个类数组对象。
只有两个特性于数组相同:1、通过下标获取元素;2、具有length属性
- length: 返回形参的个数
- name: 返回函数的名称
- toString: 返回函数的字符串形式
- call方法: 更改方法的this指向,实现继承,接受N个参数,第一个参数是新的this对象,第二个到第N个是参数
- apply方法: 更改方法的this指向,实现继承,接受2个参数,第一个参数是新的this对象,第二个是参数数组集合
- bind方法: 将函数绑定到某个对象上
- prototype: 原型
- hasOwnProperty: 检测是否存在某个属性
- isPrototypeOf: 用于判断当前对象是否为另外一个对象的原型。
- ......
对象特性 之 自定义属性
内部 和 外部的 变量 及 方法
类的特性
类的特性:new 可以作为构造函数
箭头函数
箭头函数的设计之初就是为了设计一种更为简短的函数并且不绑定this。所以箭头函数不为参数super、this或者new.target定义本地绑定。箭头函数中的这些属性由父级上下文决定。对于这样的函数特性,设计者认为没有必要委托给能够[[Construct]]的目标函数。所以函数对象没有[[Construct]]。由js中函数对象的原型可知,没有构造函数,也就没有构造原型的需求,所以箭头函数也不存在prototype属性。