Sono un grande fan di ES2 Function.prototype.bind
e argomenti currying (fondamentalmente creando argomenti predefiniti per le funzioni).Confusione su Function.prototype.bind()
Mi prendevo un po 'in giro, ma non riesco più a immaginare la mia vita. Questo è il mio parco giochi:
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);
L'uscita registro per questo è la seguente:
hello()
"this" is: Object{ what="dafuq" }
arguments: [2,42]
Ma io non capisco come mai l'oggetto {what: 'dafuq'}
si fa strada come punto di riferimento per la this
all'interno foo
. Per quanto ho capito, stiamo creando una chiamata vincolata a Function.prototype.call
. Consente di controllare la sinossi MDN per .bind()
rapidamente:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
così, thisArg
per .call
è la funzione hello
, seguito dalla lista argomenti. Fondamentalmente quello che succede è questo
Function.prototype.call.call(hello, {what: 'dafuq'}, 2);
... uuhhh ora il mio cervello fa male un po '. Penso di avere un'idea ora cosa succede, ma per favore qualcuno trovi belle parole solide per spiegarlo in dettaglio.
- come
{what: 'dafuq'}
diventa ilthis reference
sì 'pippo' è il metodo di chiamata, ma non chiamiamo mai' foo.call (thisArg) 'giusto? lo chiamiamo direttamente con '()'. Non capisco: p – jAndy
@jAndy: hai limitato il primo argomento di '.call' usando' .bind' al tuo oggetto. Quindi dal momento che questa "versione" di '.call' ha un primo argomento associato, lo userà sempre come contesto di chiamata. –
la "versione" vincolata di '.call()' dovrebbe avere 'ciao' come thisArg, no? Dopodiché, eseguiamo quel '.call()' legato solo passando i parametri formali. Doh, beh potrebbe essere che sono bloccato mentalmente qui, ancora a pensarci. – jAndy