The problem is that you probably have a typo: instead, you should write out.bind(window, "bla")() , which will lead to the same result as the working call.
Why is there an error with the current code? Well out.call.bind returns a function that captures the value of this from call to window . However, call expects this be a function that window not. The result is a given error.
From the annotated specification of ES5 :
15.3.4.5 Function.prototype.bind (thisArg [, arg1 [, arg2, ...]])
The bind method takes one or more arguments, thisArg and (optionally) arg1, arg2, etc., and returns a new function object by following these steps:
1. Let Target be the this value. 2. If IsCallable(Target) is false, throw a TypeError exception. [...]
You get a TypeError as expected.
Adding
Using out.call.bind , like the similar out.call.call , leads to the "redirecting the target" to out.call - that is, instead of a call being called to out , it will be called to something else. Example:
function foo(x) { console.log("this", this, "foo", x); } function bar(x) { console.log("this", this, "bar", x); } foo.call.bind(bar, window, 42)();
source share