Comprobar si una variable es de tipo función

Supongamos que tengo una variable cualquiera, que está definida de la siguiente manera:

var a = function() {/* Statements */};

Quiero una función que compruebe si el tipo de la variable es de tipo función, es decir, :

function foo(v) {if (v is function type?) {/* do something */}};
foo(a);

¿Cómo puedo comprobar si la variable a es de tipo Función de la forma definida anteriormente?

if (typeof v === "function") {
    // do something
}
Comentarios (6)
Solución

Seguro que la forma de underscore's es más eficiente, pero la mejor forma de comprobarlo, cuando la eficiencia no es un problema, está escrita en la página de underscore's enlazada por @Paul Rosania.

Inspirado por underscore, la función final isFunction es la siguiente:

function isFunction(functionToCheck) {
 return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
Comentarios (11)

Underscore.js utiliza una prueba más elaborada pero de gran rendimiento:

_.isFunction = function(obj) {
  return !!(obj && obj.constructor && obj.call && obj.apply);
};

Véase: http://jsperf.com/alternative-isfunction-implementations

EDIT: las pruebas actualizadas sugieren que typeof podría ser más rápido, ver http://jsperf.com/alternative-isfunction-implementations/4

Comentarios (6)