次のように定義されている任意の変数があるとします。
var a = function() {/* Statements */};
この変数の型が関数型であるかどうかをチェックする関数が欲しいです。
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
変数 a
の型が Function
であるかどうかを、上で定義した方法でチェックするにはどうしたらよいでしょうか。
確かにunderscore'の方法の方が効率的ですが、効率が問題にならない場合の最良のチェック方法は、@Paul Rosania氏がリンクしているunderscore'のページに書かれています。
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 を参照してください。