关于箭头函数为什么没有this

2,429 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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: 用于判断当前对象是否为另外一个对象的原型。
  • ......

WX20220410-175223.png

对象特性 之 自定义属性

内部 和 外部的 变量 及 方法

类的特性

类的特性:new 可以作为构造函数

箭头函数

箭头函数的设计之初就是为了设计一种更为简短的函数并且不绑定this。所以箭头函数不为参数super、this或者new.target定义本地绑定。箭头函数中的这些属性由父级上下文决定。对于这样的函数特性,设计者认为没有必要委托给能够[[Construct]]的目标函数。所以函数对象没有[[Construct]]。由js中函数对象的原型可知,没有构造函数,也就没有构造原型的需求,所以箭头函数也不存在prototype属性。