[javascript] 변수가 함수 타입인지 확인

다음과 같이 정의 된 변수가 있다고 가정하십시오.

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

변수 유형이 함수와 같은지 확인하는 함수를 원합니다. 즉 :

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

변수 aFunction위에서 정의한 방식 인지 확인하려면 어떻게 해야합니까?



답변

확실히 밑줄의 방법이 더 효율적이지만 효율성이 문제가되지 않을 때 확인하는 가장 좋은 방법은 @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 참조)


답변

몇 가지 방법이 있으므로 모두 요약하겠습니다.

  1. 가장 좋은 방법은 :
    function foo (v) {if (v instanceof Function) {/ * 무언가를 수행 * /}};
    
    

    가장 성능이 뛰어나고 (문자열 비교가 아님) 우아한 솔루션-instanceof 연산자는 브라우저에서 매우 오랫동안 지원되었으므로 걱정하지 마십시오. IE 6에서 작동합니다.

  2. 다음으로 가장 좋은 방법은 다음과 같습니다.
    function foo (v) {if (typeof v === "function") {/ * 무언가를 수행 * /}};
    
    

    단점은 typeof자동 실패, 나쁨에 취약하다는 것입니다. 따라서 오타가있는 경우 (예 : “finition”)-이 경우`if`는 false를 반환하고 나중에 오류가 있음을 알 수 없습니다. 당신의 코드

  3. 다음으로 가장 좋은 방법은 다음과 같습니다.
    함수 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]';
}


답변

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