a ist eine Funktion, was macht a.call.call wirklich?

8

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?

    
tjfdfs 21.01.2016, 06:05
quelle

2 Antworten

8

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.

%Vor%

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() .

  • [Spezifikation] In 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.

    
Toxni Lee 25.05.2017, 19:00
quelle
1

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

    
Oxi 21.01.2016 07:15
quelle

Tags und Links