Three ways to control exactly what this means inside a function.
call, apply, and bind all exist to let you explicitly set what this refers to inside a function, overriding whatever the normal call-site rules would produce. call and apply do this immediately — call takes arguments individually (fn.call(obj, a, b)), while apply takes them as an array (fn.apply(obj, [a, b])) — and both invoke the function right away with the given this.
bind is different: instead of calling the function, it returns a new function permanently bound to the given this, which is useful when you need to pass a method somewhere else (like an event handler) and guarantee it keeps its original context no matter how it's later called. That returned function's this can't be overridden again, even by another call or apply — once bound, it's locked.
What you'll walk away knowing