Context in Javascript is always established by the way you call a function.
var fn = ''.toUpperCase.call
This assigns the prototype implementation of the call
function to fn
. If you now call fn()
, there’s no context to the call. call
would try to invoke the function object it was associated with. However, that context is established at call time. Since you’re not giving it any context at call time, some internal component of call
is throwing an error.
You’d have to do this:
fn.call(''.toUpperCase)
That’s right, you call
the call
function, establishing a context, namely the toUpperCase
string function. In this specific case this would lead to another error inside toUpperCase
, since it is not bound to a specific context. You’d need to establish that context explicitly as well:
var fn = ''.toUpperCase.call
fn.call(''.toUpperCase.bind(''))
Also see How does the “this” keyword work?