The best approach to avoid the use of anonymous functions altogether requires a self-reference, and instead uses a named function.
using call(..), we ensure the "this" points at the function object itself.
"this" is not an author time-binding but a run time-binding.
When a function is executed, a context is created known as execution context.
"this" is a binding made for each function invocation, based entirely on its call-site.
Boxing - If you pass a simple primitive value (boolean, num, or string) as "this" binding, the primitive value is wrapped in its object form.
Four rules of determining "this" • If the function is called with "new", then it's a new binding. • function called with call or apply and encoded in hard binding, then it is an explicit binding. • function with a context object will fall under the implicit binding category • Otherwise, default binding.
Arrow functions do not use these rules, these are the functions that use the "fat-arrow" operator "=>". The lexical binding of an arrow function can not be overridden.
If you pass null or undefined as a parameter to call or apply or bind, then those values are ignored, and instead default binding rule applies. This is only done when you want to spread an array to be passed as arguments to functions. Though this can cause side effects, hence we use a DMZ(demilitarised zone) object, which is represented by ø (phi) stating the null, but in a better way.