Soy un gran admirador de ES5 Function.prototype.bind
y argumentos currying (básicamente creando argumentos predeterminados para funciones).Confusión sobre Function.prototype.bind()
Estaba bromeando con eso un poco, pero ya no puedo imaginar mi propia construcción. Esta es mi campo de juego:
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);
La salida del registro para esto es la siguiente:
hello()
"this" is: Object{ what="dafuq" }
arguments: [2,42]
Pero no entiendo cómo en la tierra el objeto {what: 'dafuq'}
se abre paso como una referencia para la this
dentro foo
. Por lo que yo entiendo, estamos creando una llamada enlazada a Function.prototype.call
. Vamos a comprobar la sinopsis MDN para .bind()
rápidamente:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
así, thisArg
para .call
es la función hello
, seguido de la lista de argumentos. Básicamente lo que sucede es esto
Function.prototype.call.call(hello, {what: 'dafuq'}, 2);
... uuhhh ahora me duele un poco el cerebro. Creo que ahora tengo una idea de lo que sucede, pero que alguien encuentre buenas palabras sólidas para explicarlo en detalle.
- cómo
{what: 'dafuq'}
se convierte en elthis reference
sí 'foo' es el método de llamada, pero nunca llamamos' foo.call (thisArg) '¿verdad? simplemente lo llamamos directamente por '()'. No lo entiendo: p – jAndy
@jAndy: Vincula el primer argumento de '.call' usando' .bind' a su objeto. Entonces, dado que esta "versión" de '.call' tiene un primer argumento vinculado, siempre lo usará como contexto de llamada. –
la "versión" vinculada de '.call()' debería tener 'hello' como thisArg, ¿no? Después de eso, ejecutamos ese límite '.call()' solo pasando en parámetros formales. Doh, bien podría ser. Estoy mentalmente bloqueado aquí, todavía lo estoy imaginando. – jAndy