Diese Codes werden auf chrome devtool ausgeführt.
Es scheint, als ob b.call
(gleich a.call.call
) das erste Argument aufruft, was eine Funktion ist, und übergibt das zweite Argument als this
.
Wenn das erste Argument keine Funktion ist, dann werfen Sie not a function
error.
Kann jemand erklären, wie <Function>.call.call
funktioniert?
Lassen Sie mich Ihnen ein Beispiel zeigen.
%Vor%Warum?
Wir wissen a.call(b)
bedeutet, dass a()
mit this Wert b
aufgerufen wird.
Also bedeutet a.call.call(b)
, dass Function.prototype.call()
mit diesem Wert aufgerufen wird, b wie Function.prototype.call.call(b)
.
Aber Function.prototype.call.call()
ist kein gewöhnliches Funktionsobjekt. Es kann aufgerufen werden, aber es hat keine Eigenschaft. Es gibt einige eindeutige Regeln , um sie aufzurufen.
Tatsächlich ist Function.prototype.call.call(b)
ein exotisches Objekt, außerdem ein gebundenes exotisches Objekt.
[Spezifikation] Eine gebundene Funktion ist ein exotisches Objekt, das ein anderes Funktionsobjekt umschließt.
[Spezifikation] Der Aufruf einer gebundenen Funktion führt in der Regel zu einem Aufruf der eingepackten Funktion.
Also bedeutet Function.prototype.call.call(a)
einfach a()
.
a.call.call(x)
bedeutet, dass x aufgerufen wird, also x()
.
Function.prototype.call(thisArg)
, wenn thisArg nicht definiert oder null ist, wird es durch globales Objekt ersetzt. a.call.call()
bedeutet a.call.call(undefined)
bedeutet a.call.call(window)
bedeutet, dass window
aufgerufen wird.
Versuchen Sie, window
aufzurufen, Sie erhalten Uncaught TypeError: window is not a function
, versuchen Sie also a.call.call()
aufzurufen, dann erhalten Sie Uncaught TypeError: a.call.call is not a function
.
Ich hoffe, es hilft.
Ausgehend von den grundlegenden Dingen,
Was ist .call
? es ist eine Funktion, die in Function.prototype
verfügbar ist.
Damit es für jede Funktion aufgerufen werden kann, können Sie a.call
aufrufen.
Nun, was macht ein .call
? Es setzt den this
-Kontext auf die Funktion, die Sie .call
aufgerufen haben. Wenn Sie also a.call
aufrufen, können Sie in der Funktion this
(über den ersten Parameter, den Sie an die Funktion a
übergeben) einen .call
-Kontext setzen.
Was ist this
in der Funktion .call
? es ist nichts anderes als die Funktion, die du .call
anrufst (in deinem Fall a
),
Zur Vereinfachung nimmst du an, innerhalb der .call
könnte es die Funktion wie this()
aufrufen
(und das ist nichts anderes als a()
aufrufen) - so weit so gut
auf Ihre Frage
%Vor% Was passiert hier? Die zweite .call
(ich zähle von links nach rechts) ruft zuerst .call
und this
für die erste .call
auf, was nichts anderes als der erste Parameter ist, der eine Funktion ist.
Jetzt wird zuerst .call
this()
aufrufen (denken Sie daran, dass dies vom zweiten .call
festgelegt wird und es der erste Parameter ist, den Sie übergeben haben, und dies ist eine Funktion).
Ich hoffe, ich könnte erklären, was ich erklären wollte.
lassen Sie mich erzählen, warum Sie mit a.call.call
verwechselt wurden. Weil du denkst, wo ist meine Funktion a
in all dieser Verwirrung verschwunden?
das ist eigentlich nicht involviert, sobald du second .call
anrufst (hier this
auf erstes .call
kommt von second .call
, was deine Funktion a
in diesem Fall überflüssig macht)
in Ihrem Fall .call.call
hätte am Function.prototype
oder Object
oder einer anderen Funktion aufgerufen werden sollen (erinnern Sie sich, dass .call
Teil von Function.prototype
ist und für jede Funktion aufgerufen werden kann)
Sie sollten es also gemacht haben
%Vor%oder sogar
%Vor% Jetzt war ich letzte Woche verwirrt über diese Sache (nicht .call.call
, aber .call.bind
), ich habe hier eine Frage gestellt, und jemand hat es mir sehr detailliert erklärt, du kannst es finden HERE
Ich habe versucht, aus meinem Verständnis auf die Frage zu antworten, die ich gestellt habe.
nach all dem ist SO für
UPDATE:
Sie fragen "Es scheint, dass b.call (wie a.call.call) das erste Argument aufruft, das eine Funktion ist, und dann das zweite Argument als das übergeben. Wenn das erste Argument keine Funktion ist, dann Werfen Sie keinen Funktionsfehler. "
Ihre Annahme ist hier richtig
Tags und Links javascript call