Pregunta ¿Cómo puedo verificar si una variable de JavaScript es un tipo de función?


Supongamos que tengo cualquier variable, que se define de la siguiente manera:

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

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

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

¿Cómo puedo verificar si la variable 'a' es de tipo función en la forma definida anteriormente?


659
2018-05-14 05:27


origen


Respuestas:


El guión bajo del subrayado es más eficiente, pero la mejor manera de verificarlo, cuando la eficiencia no es un problema, está escrito en la página del subrayado enlazada por @Paul Rosania.

Inspirada en el guion bajo, la función isFunction final es la siguiente:

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

281
2017-09-09 02:24



if (typeof v === "function") {
    // do something
}

1267
2018-05-14 05:31



Underscore.js usa una prueba más elaborada pero de alto rendimiento:

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

Ver: http://jsperf.com/alternative-isfunction-implementations

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


116
2018-05-14 05:33



Hay varias formas, así que resumiré todas

  1. La mejor manera es:
    
    función foo (v) {if (v instancia de Función) {/ * hacer algo * /}};
    
    
    La solución más eficiente (sin comparación de cadenas) y elegante: el operador instanceof ha sido admitido en navegadores durante mucho tiempo, así que no se preocupe: funcionará en IE 6.
  2. La siguiente mejor manera es:
    
    función foo (v) {if (typeof v === "función") {/ * hacer algo * /}};
    
    
    desventaja de typeof es que es susceptible de fallas silenciosas, malo, entonces si tiene un error tipográfico (por ejemplo, "finction") - en este caso el `if` simplemente devolverá false y no sabrá que tiene un error hasta más adelante en su código
  3. La siguiente mejor manera es:
    
    function isFunction (functionToCheck) {
        var getType = {};
        return functionToCheck && getType.toString.call (functionToCheck) === '[object Function]';
    }
    
    
    Esto no tiene ninguna ventaja sobre la solución n. ° 1 o n. ° 2, pero es mucho menos legible. Una versión mejorada de esto es
    
    función isFunction (x) {
        return Object.prototype.toString.call (x) == '[object Function]';
    }
    
    
    pero aún mucho menos semántica que la solución # 1

81
2017-10-31 22:50



jQuery  Referencia

$.isFunction(functionName);

AngularJS  Referencia

angular.isFunction(value);

Lodash  Referencia

_.isFunction(value);

Guion bajo  Referencia

_.isFunction(object); 

Node.js desaprobado desde v4.0.0 Referencia

var util = require('util');
util.isFunction(object);

59
2018-01-27 17:16



@grandecomplex: hay una gran cantidad de verbosidad en su solución. Sería mucho más claro si se escribe así:

function isFunction(x) {
  return Object.prototype.toString.call(x) == '[object Function]';
}

53
2018-03-02 18:37



var foo = function(){};
if (typeof foo === "function") {
  alert("is function")
}


46
2018-01-28 05:56