Confusion about Function.prototype.bind()

Viewed 1054

I'm a huge fan of ES5's Function.prototype.bind and currying arguments (basically creating default arguments for functions).

I was fooling around with that a bit, but I can't for the life of me figure out my own construct anymore. This is my playground:

function hello( arg1, arg2 ) {
    console.log('hello()');
    console.log('"this" is: ', this);
    console.log('arguments: ', arguments);
}

var foo = Function.prototype.call.bind( hello,{what: 'dafuq'}, 2 );
foo( 42 );

The log output for this is as follows:

hello()
"this" is: Object{ what="dafuq" }
arguments: [2,42]

But I don't understand how on earth the {what: 'dafuq'} object makes its way as a reference for the this within foo. As far as I understand it, we are creating a bound call to Function.prototype.call. Lets check the MDN synopsis for .bind() quickly:

fun.bind(thisArg[, arg1[, arg2[, ...]]])

so, thisArg for .call is the hello function, followed by the arguments list. Basically what happens is this

Function.prototype.call.call( hello, {what: 'dafuq'}, 2);

...uuhhh now my brain hurts a little. I think I have an idea now what happens, but please someone find nice solid words to explain it in detail.

  • how {what: 'dafuq'} becomes the this reference
3 Answers
Related