문제

JavaScript의 함수가 정의되었는지 어떻게 알 수 있나요?

나는 이런 것을하고 싶다

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

하지만 그것은 나에게

콜백은 함수가 아닙니다

콜백이 정의되지 않은 경우 오류가 발생합니다.

도움이 되었습니까?

해결책

typeof callback === "function"

다른 팁

현재의 모든 답변은 리터럴 문자열을 사용합니다. 가능하면 코드에 포함하지 않는 것을 선호합니다. 그렇지 않습니다(부팅할 때 귀중한 의미상 의미를 제공합니다).

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

개인적으로 저는 코드에 남아 있는 문자열 수를 줄이려고 노력합니다.


또한, 내가 그 사실을 알고 있는 동안 typeof 는 함수가 아니라 연산자이므로 후자처럼 보이게 만드는 구문을 사용해도 해가 거의 없습니다.

if (callback && typeof(callback) == "function")

콜백 자체는 다음과 같이 평가됩니다. false 그렇다면 undefined, null, 0, 또는 false.비교 null 지나치게 구체적이다.

함수가 구현되었는지 확인하는 메서드는 변수가 정의되지 않은 경우에도 실패하므로 문자열 수신을 지원하는 보다 강력한 방법을 사용하고 있습니다.

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}

JavaScript를 처음 접했을 때 동작이 변경되었는지 확실하지 않지만, availableFunction이 정의되지 않은 경우 Jason Bunting(6년 전)이 제공한 솔루션이 작동하지 않습니다.

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

이것은 ReferenceError: possibleFunction is not defined 엔진이 availableFunction 기호를 해결하려고 할 때 오류가 발생합니다(Jason의 답변에 대한 설명에서 언급했듯이).

이 동작을 방지하려면 함수가 존재하는지 확인하려는 함수의 이름만 전달하면 됩니다.그래서

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

이렇게 하면 변수를 확인하려는 함수로 설정하거나 정의되지 않은 경우 빈 개체로 설정하므로 위에서 언급한 문제를 피할 수 있습니다.

노력하다:

if (typeof(callback) == 'function')

나는 할 수도 있다

try{
    callback();
}catch(e){};

나는 받아들여지는 대답이 있다는 것을 알고 있지만 아무도 이것을 제안하지 않았습니다.이것이 관용적이라는 설명에 맞는지는 잘 모르겠지만 모든 경우에 적용됩니다.

최신 JavaScript 엔진에서는 finally 대신 사용할 수 있습니다.

if ('function' === typeof callback) ...
typeof(callback) == "function"
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}

이 시도:

callback instanceof Function

당신이 보면 원천 @Venkat Sudheer Reddy Aedama가 언급한 underscorejs 라이브러리에서 다음을 볼 수 있습니다.

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

이것은 단지 내 힌트, 힌트 답변입니다 :>

노력하다:

if (!(typeof(callback)=='undefined')) {...}

당신이 사용하는 경우 http://underscorejs.org, 당신은:http://underscorejs.org/#isFunction

_.isFunction(callback);

jQuery 함수가 정의되어 있는지 확인하는 방법을 찾고 있었는데 쉽게 찾을 수 없었습니다.

필요할 수도 있겠네요 ;)

if(typeof jQuery.fn.datepicker !== "undefined")

만약 callback() 함수에서 한 번만 호출하는 것이 아니라 재사용을 위해 인수를 초기화할 수 있습니다.

callback = (typeof callback === "function") ? callback : function(){};

예를 들어:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

제한 사항은 정의되지 않은 콜백 인수를 항상 실행한다는 것입니다.

전역 함수의 경우 대신 이것을 사용할 수 있습니다 eval 답변 중 하나에서 제안되었습니다.

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

당신이 사용할 수있는 global.f instanceof Function 뿐만 아니라, 하지만 afaik.의 가치 Function 프레임마다 다르기 때문에 단일 프레임 응용 프로그램에서만 제대로 작동합니다.그렇기 때문에 우리가 흔히 사용하는 typeof 대신에.일부 환경에서는 이상이 있을 수 있습니다. typeof f 너무, 예를 들어예를 들어 MSIE 6-8의 일부 기능 alert "객체" 유형이 있었습니다.

로컬 기능을 사용하면 허용되는 답변에 있는 기능을 사용할 수 있습니다.함수가 로컬인지 전역인지 테스트할 수도 있습니다.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

질문에 대답하자면, 예제 코드는 최신 브라우저에서 오류 없이 작동하므로 문제가 무엇인지 잘 모르겠습니다.

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

메모:나는 사용할 것이다 callback !== undefined 대신에 callback != null, 그러나 그들은 거의 동일합니다.

이전 답변의 전부는 아니더라도 대부분 함수를 호출하는 부작용이 있습니다.

여기 모범 사례

당신은 기능이 있습니다

function myFunction() {
        var x=1;
    }
직접 테스트하는 방법

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
문자열을 사용하면 함수 이름을 정의하는 데 한 곳만 가질 수 있습니다.

//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');

한 줄 솔루션:

function something_cool(text, callback){
    callback && callback();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top