Ich bin ein großer Fan von ES5 Function.prototype.bind
und currying Argumente (im Grunde erstellen Standardargumente für Funktionen).Confusion über Function.prototype.bind()
Ich habe ein bisschen herumalbern, aber ich kann nicht für das Leben von mir herausfinden, mein eigenes Konstrukt mehr. Das ist mein Spielplatz:
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);
Die Protokollausgabe hierfür ist wie folgt:
hello()
"this" is: Object{ what="dafuq" }
arguments: [2,42]
Aber ich verstehe nicht, wie auf der Erde die {what: 'dafuq'}
Objekt seinen Weg als Referenz macht sich für die this
innerhalb foo
. Soweit ich es verstehe, erstellen wir einen gebundenen Anruf zu Function.prototype.call
. Lets überprüfen Sie die MDN Synopsis für .bind()
schnell:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
so, thisArg
für .call
ist die hello
Funktion, durch die Argumente Liste gefolgt. Grundsätzlich was passiert, ist dies
Function.prototype.call.call(hello, {what: 'dafuq'}, 2);
... uhhhh jetzt schmerzt mein Gehirn ein wenig. Ich denke, ich habe jetzt eine Idee, was passiert, aber bitte findet jemand schöne Worte, um es im Detail zu erklären.
- wie
{what: 'dafuq'}
diethis reference
ja 'foo' ist die Call-Methode, aber wir nennen nie' foo.call (thisArg) 'richtig? wir nennen es einfach direkt mit '()'. Ich verstehe es nicht: p – jAndy
@jAndy: Sie haben das erste Argument von '.call' mit' .bind' an Ihr Objekt gebunden. Da diese "Version" von ".call" ein gebundenes erstes Argument hat, wird es immer als aufrufender Kontext verwendet. –
die gebundene "Version" von '.call()' sollte 'hallo' als thisArg, nein haben? Danach führen wir diese gebundene '.call()' nur übergeben formale Parameter. Doh, na ja, ich bin hier nur mental blockiert, ich denke immer noch daran. – jAndy