Warum typeof zum Identifizieren einer Funktion verwenden?

8

Gibt es irgendwelche wichtigen Gründe für die Verwendung von

? %Vor%

versus

%Vor%

um zu erkennen, ob eine Variable eine Funktion ist?

Abgesehen von dem offensichtlichen, dass jemand ein Objekt wie folgt erstellen kann:

%Vor%

Das Problem, das ich habe, ist das

%Vor%

gibt true zurück, aber

%Vor%

gibt false zurück

    
samshull 20.02.2011, 00:05
quelle

6 Antworten

10

Am sichersten ist es, die interne Eigenschaft [[Class]] zu überprüfen, indem Sie das Objekt als Argument thisArg der Methode .call() festlegen, wenn Sie Object.prototype.toString aufrufen.

%Vor%

Natürlich könnte man leicht eine Funktion daraus machen:

%Vor%

Das ist sehr einfach, und es könnte einige Verbesserungen geben, aber Sie bekommen die Idee.

    
user113716 20.02.2011, 00:16
quelle
5

Gemäß der ECMAScript-Spezifikation sollte Folgendes für Literale für reguläre Ausdrücke gelten:

  

Ein Literal für reguläre Ausdrücke ist ein Eingabeelement, das in ein RegExp -Objekt konvertiert wird ( Abschnitt 15.10 ) wenn es gescannt wird. Das Objekt wird erstellt, bevor die Auswertung des enthaltenen Programms oder der Funktion beginnt.

So typeof /regex/ sollte "object" ergeben:

%Vor%

Und der Konstruktor des Objekts, das vom regulären Ausdrucksliteral erstellt wird, sollte RegExp sein:

%Vor%

Ähnlich sollte eine Funktionsdefinition eine Funktion ergeben Objekt:

%Vor%

Aber obwohl dies ein Objekt Funktion zurückgibt, verwenden Sie den Operator typeof sollte stattdessen nicht "object" , sondern "function" ergeben:

%Vor%

Dies liegt an der Unterscheidung, ob das Objekt die interne [[Call]] implementiert. -Eigenschaft , die speziell für Funktion -Objekte .

Beachten Sie, dass sich Javascript-Implementierungen so verhalten sollten. Also werden alle Gleichungen als wahr behauptet.

    
Gumbo 20.02.2011 00:54
quelle
2

Überprüfen Sie die Annahmen in der Post (siehe Gumbo's Kommentar).

%Vor%

Dies gibt false in Firefox 3.6.13 zurück.

Nur zur Unterhaltung, Firefox 3.6.13:

%Vor%

IE8:

%Vor%

Chrome 9:

%Vor%     
quelle
2

Ein regulärer Ausdruck ist eine Funktion

/bar/("bar") === ["bar"]

Also typeof /bar/ === "function"

Obwohl nur chrome erkennt, dass ein regexp-Literal als Funktion verwendet werden kann. Ob das so sein sollte oder nicht, ist zu gewinnen. Sie können es wie eine Funktion behandeln!

    
Raynos 20.02.2011 00:35
quelle
1

jQuerys isFunction vermeidet das RegExp -Problem, das Sie bei toString angeben - das Objekt und die Überprüfung das Ergebnis gegen eine Karte bekannter Typen. Von der neuesten Quelle , hier ist die Karte:

%Vor%

Und so wird es benutzt:

%Vor%

Sie können viel lernen, wenn Sie die jQuery-Quelle lesen.

Wayne Burkett 20.02.2011 00:22
quelle
-1

typeof variable === 'function' ist besser als !!variable.call , weil !!variable.call einen Fehler auslöst, wenn die Variable nicht definiert oder null ist.

    
user2335861 06.05.2013 13:07
quelle

Tags und Links