Think of this as a sticky note that says 'my current owner.' The owner changes depending on how the function is called: the object before the dot, the object created by new, or whatever you explicitly set with call/apply/bind.
Imagine a name tag that says 'Owner: ______'. When you call a function as a method on an object (obj.sayHi()), the tag gets filled with that object's name. When you call a function alone (sayHi()), the tag might be blank (undefined) or default to the global name tag, depending on rules. With bind, you can permanently write a name on the tag. With call or apply, you can temporarily hand the tag to someone else. Arrow functions, however, don't get their own tag; they just look at the tag of the person standing next to them (their lexical scope).