# 0x01 详细版本

A function object is an object that supports the [[Call]] internal method. A constructor is an object that supports the [[Construct]] internal method. Every object that supports [[Construct]] must support [[Call]]; that is, every constructor must be a function object. Therefore, a constructor may also be referred to as a constructor function or constructor function object.

An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, this, or new.target within an ArrowFunction must resolve to a binding in a lexically enclosing environment.

The goal of Arrow Functions is to address and resolve several common pain points of traditional Function Expression:

• Lexical this binding;
• Shorter syntactical form (() => {} vs. function () {})

Lexical this matches the dominant cohort measured by Kevin Smith (see the BTF Measurements thread that either does not use this or wants it lexically bound.

• Best results after modifying subject code to use method definition shorthand and only then scanning for function.
• From lexical this it follows that arrow functions are not constructors (no .prototype or [[Construct]]).

We do not want to delegate to a target function that can [[Construct]], because there is no such target function -- we're not trying to sugar .bind on a full function. That is too expensive and general (no pre-args, no full function under the hood).

Lexical-only this binding means no [[Construct]] and no .prototype for arrow functions. I'm ok with this.