假设有任意变量,定义如下:

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

我想要一个函数来检查变量的类型是否为类函数。例如:

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

我怎样才能检查变量a是否为上述定义的函数类型?


当前回答

另一种简单的方法:

var fn = function () {}
if (fn.constructor === Function) {
  // true
} else {
  // false
}

其他回答

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

我认为你可以在Function原型上定义一个标志,然后检查你想测试的实例是否继承了这个标志

定义一个标志:

Function.prototype.isFunction = true; 

然后检查它是否存在

var foo = function(){};
foo.isFunction; // will return true

缺点是,另一个原型可以定义相同的标志,然后它是没有价值的,但如果你可以完全控制所包含的模块,这是最简单的方法

你应该在js中使用typeOf操作符。

var a=function(){
    alert("fun a");
}
alert(typeof a);// alerts "function"

我发现在测试IE8中的本地浏览器功能时,使用toString、instanceof和typeof都不能工作。下面是一个在IE8中运行良好的方法(据我所知):

function isFn(f){
    return !!(f && f.call && f.apply);
}
//Returns true in IE7/8
isFn(document.getElementById);

或者,您可以使用以下方法检查本机函数:

"getElementById" in document

不过,我在某个地方读到过,这在IE7及以下版本并不总是有效。

js使用了一个更精细但高性能的测试:

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

参见:https://jsben.ch/B6h73

编辑:更新的测试表明typeof可能更快,参见https://jsben.ch/B6h73