The one keyword whose value depends entirely on how a function gets called, not where it's written.
Unlike variables, this isn't determined by where a function is defined — it's determined by how the function is called. The same function can have a completely different this depending on whether it's called as a method (obj.fn()), as a plain function (fn()), as a constructor (new Fn()), or with an explicit binding (fn.call(obj)). That call-site dependency is exactly what trips people up when a method is passed as a callback and loses its object context along the way.
Arrow functions break this pattern intentionally — they don't have their own this at all, and instead capture this lexically from the enclosing scope at the time they're defined. That's why arrow functions are often the fix for 'this is undefined inside my callback,' but it also means arrow functions make bad object methods, since they'll capture this from the surrounding context instead of the object they're attached to.
What you'll walk away knowing