Ας υποθέσουμε ότι έχω οποιαδήποτε μεταβλητή, η οποία ορίζεται ως εξής:
var a = function() {/* Statements */};
Θέλω μια συνάρτηση η οποία να ελέγχει αν ο τύπος της μεταβλητής είναι τύπου συνάρτησης. δηλ:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Πώς μπορώ να ελέγξω αν η μεταβλητή α
είναι τύπου Συνάρτηση
με τον τρόπο που ορίζεται παραπάνω;
if (typeof v === "function") {
// do something
}
Σίγουρα ο τρόπος underscore's είναι πιο αποτελεσματικός, αλλά ο καλύτερος τρόπος για να ελέγξετε, όταν η αποτελεσματικότητα δεν είναι θέμα, είναι γραμμένος στη σελίδα underscore's που συνδέθηκε από τον @Paul Rosania.
Εμπνευσμένη από την underscore, η τελική συνάρτηση isFunction έχει ως εξής:
function isFunction(functionToCheck) {
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
Το Underscore.js χρησιμοποιεί ένα πιο περίπλοκο αλλά εξαιρετικά αποδοτικό τεστ:
_.isFunction = function(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
Βλέπε: http://jsperf.com/alternative-isfunction-implementations
EDIT: οι ενημερωμένες δοκιμές δείχνουν ότι η typeof μπορεί να είναι ταχύτερη, βλ. http://jsperf.com/alternative-isfunction-implementations/4