Arrow functions don't bind this; they borrow it. The spec marks an arrow with [[ThisMode]]: lexical. On a call, OrdinaryCallBindThis sees that mode and returns without binding anything, and the arrow's Function Environment Record is flagged lexical, so the this lookup passes over it and continues outward to the nearest scope that really has a this binding.
Two consequences:
thisis fixed by where the arrow is written. It is thethisof the enclosing function for the call that created the arrow. Each call of the parent creates a new arrow with that call'sthis.- Nothing at the call site can change it.
call,applyandbindstill run, but thethisArgis ignored.newfails outright because arrows have no[[Construct]]and noprototype.
The same lookup applies to arguments, super and new.target: an arrow has none of its own.
That makes arrows right for callbacks inside a method (map, promise handlers, timers) that need the method's this, and wrong for methods and constructors, where you want the receiver to come from the call. An arrow as an object-literal property sees the surrounding this (undefined in a module), not the object. A class field handler = () => ... is the useful exception: the initialiser runs with this set to the new instance, so each instance gets a function bound to itself.