How does Function.prototype.call.bind work?

Well,

  • Function.prototype.call references the “call” function, which is used to invoke functions with chosen this values;
  • The subsequent .bind refers to the “bind” function on the Function prototype (remember: “call” is a function too), which returns a new function that will always have this set to the passed-in argument.
  • The argument passed to “bind” is the “toString” function on the Object prototype, so the result of that whole expression is a new function that will run the “call” function with this set to the “toString” function.

The result, therefore, is like this code: Object.prototype.toString.call( param ). Then, the “console.log” call passes that function an array, and there you have it.

edit Note that Object.prototype.toString.call( param ) is like param.toString() really, when “param” is an object. When it’s not, then the semantics of the “call” function are to turn it into one in the normal ways JavaScript does that (numbers -> Number, strings -> String, etc).

edit, 24 May2016 — That last sentence above is not accurate with ES2015. New JavaScript runtimes do not “autobox” primitive types when those are involved with a function call as a this value.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)