다음과 같이 정의 된 변수가 있다고 가정하십시오.
var a = function() {/* Statements */};
변수 유형이 함수와 같은지 확인하는 함수를 원합니다. 즉 :
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
변수 a
가 Function
위에서 정의한 방식 인지 확인하려면 어떻게 해야합니까?
답변
확실히 밑줄의 방법이 더 효율적이지만 효율성이 문제가되지 않을 때 확인하는 가장 좋은 방법은 @Paul Rosania가 링크 한 밑줄의 페이지에 기록되어 있습니다.
밑줄에서 영감을 얻은 최종 isFunction 함수는 다음과 같습니다.
function isFunction(functionToCheck) {
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
답변
if (typeof v === "function") {
// do something
}
답변
Underscore.js 는보다 정교하지만 성능이 뛰어난 테스트를 사용합니다.
_.isFunction = function(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
참조 : http://jsperf.com/alternative-isfunction-implementations
편집 : 업데이트 된 테스트는 typeof가 더 빠를 수 있음을 제안합니다 ( http://jsperf.com/alternative-isfunction-implementations/4 참조)
답변
몇 가지 방법이 있으므로 모두 요약하겠습니다.
- 가장 좋은 방법은 :
function foo (v) {if (v instanceof Function) {/ * 무언가를 수행 * /}};
가장 성능이 뛰어나고 (문자열 비교가 아님) 우아한 솔루션-instanceof 연산자는 브라우저에서 매우 오랫동안 지원되었으므로 걱정하지 마십시오. IE 6에서 작동합니다.
- 다음으로 가장 좋은 방법은 다음과 같습니다.
function foo (v) {if (typeof v === "function") {/ * 무언가를 수행 * /}};
단점은
typeof
자동 실패, 나쁨에 취약하다는 것입니다. 따라서 오타가있는 경우 (예 : “finition”)-이 경우`if`는 false를 반환하고 나중에 오류가 있음을 알 수 없습니다. 당신의 코드 - 다음으로 가장 좋은 방법은 다음과 같습니다.
함수 isFunction (functionToCheck) { var getType = {}; return functionToCheck && getType.toString.call (functionToCheck) === '[객체 함수]'; }
이것은 솔루션 # 1 또는 # 2에 비해 이점이 없지만 읽기가 훨씬 어렵습니다. 이것의 개선 된 버전은
함수 isFunction (x) { return Object.prototype.toString.call (x) == '[object Function]'; }
그러나 여전히 솔루션 # 1보다 의미가 훨씬 적습니다.
답변
jQuery (버전 3.3부터 사용되지 않음) 참조
$.isFunction(functionName);
AngularJS 참조
angular.isFunction(value);
Lodash 참조
_.isFunction(value);
밑줄 참조
_.isFunction(object);
Node.js를 V4.0.0의 이후 사용되지 참조
var util = require('util');
util.isFunction(object);
답변
@grandecomplex : 솔루션에 상당한 양의 세부 정보가 있습니다. 다음과 같이 작성하면 훨씬 명확합니다.
function isFunction(x) {
return Object.prototype.toString.call(x) == '[object Function]';
}