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
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.
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.
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:
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:
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.
Ü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%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!
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:
Und so wird es benutzt:
%Vor%Sie können viel lernen, wenn Sie die jQuery-Quelle lesen.
typeof variable === 'function'
ist besser als !!variable.call
, weil !!variable.call
einen Fehler auslöst, wenn die Variable nicht definiert oder null ist.
Tags und Links javascript