"Objekt ist keine Funktion" beim Speichern von function.call in einer Variablen

8

Ich habe versucht, meinen Code kleiner zu machen, indem ich Funktionen auf Variablen zwischenspeichert. Zum Beispiel:

%Vor%

Also, anstatt Array.prototype.slice.call(arguments) aufzurufen, kann ich einfach a.call(arguments); machen.

Ich habe versucht, dies noch kleiner zu machen, indem ich Array.prototype.slice.call zwischenspeichere, aber das hat nicht funktioniert.

%Vor%

Das gibt mir TypeError: object is not a function . Warum ist das so?

typeof Array.prototype.slice.call gibt "function" zurück, wie erwartet.

Warum kann ich .call nicht in einer Variablen speichern (und dann aufrufen)?

    
Rocket Hazmat 16.12.2011, 16:07
quelle

3 Antworten

7

Function.prototype.call ist eine gewöhnliche Funktion, die mit der als this übergebenen Funktion arbeitet.

Wenn Sie call von einer Variablen aufrufen, wird this zu window , was keine Funktion ist.
Sie müssen call.call(slice, someArray, arg1, arg2)

schreiben     
SLaks 16.12.2011, 16:11
quelle
5

Versuchen Sie Folgendes:

%Vor%

Derselbe Fehler tritt auf, wenn Sie versuchen, Folgendes zu tun:

%Vor%

Der Grund dafür ist, dass Sie der Funktion x (in meinem Beispiel log ) die Variable log zuweisen. ABER Die Funktion enthält einen Aufruf von this , der nun auf window und nicht auf console verweist, wodurch der Fehler this is not an object

ausgegeben wird     
Neal 16.12.2011 16:09
quelle
4

Das Problem ist, dass call eine Methode ist (eine Funktion, die zu einem Objekt gehört), die erwartet, dass ihr Besitzer (seine this ) eine Funktion ist. Wenn Sie a = Array.prototype.slice.call schreiben, kopieren Sie die Funktion, aber nicht den Eigentümer.

Die Nachricht "object is not a function" besagt nicht, dass a keine Funktion ist, sondern dass this keine Funktion ist. Sie könnten technisch erreichen, was Sie beschreiben, indem Sie a.call(Array.prototype.slice, arguments) schreiben, aber das ist natürlich nicht das, was Sie wollen!

    
ruakh 16.12.2011 16:12
quelle

Tags und Links