IT

JavaScript 함수가 정의되어 있는지 확인하는 방법

lottoking 2020. 3. 20. 08:31
반응형

JavaScript 함수가 정의되어 있는지 확인하는 방법


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를 처음 접했을 때 동작이 변경되었는지 확실하지 않지만 가능한 경우 기능이 정의되지 않은 경우 Jason Bunting (6 년 전)이 제공 한 솔루션이 작동하지 않습니다.

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

ReferenceError: possibleFunction is not defined엔진이 possibleFunction 기호를 해결하려고 시도 하면 오류가 발생합니다 (Jason의 답변에 대한 주석에서 언급 한 바와 같이)

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

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

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


시험:

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

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

typeof(callback) == "function"

내가 할지도 모른다

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

나는 대답이 받아 들여진다는 것을 알고 있지만 아무도 이것을 제안하지 않았다. 이것이 관용구의 설명에 맞는지 확실하지 않지만 모든 경우에 작동합니다.

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


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

이 시도:

callback instanceof Function

@Venkat Sudheer Reddy Aedama 라이브러리 출처 를 보면 밑줄을 볼 수 있습니다.

_.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');


함수를 재정의하려면 함수 발생 위치에 관계없이 함수가 전역 적으로 정의되므로 발생 순서에 따라 정의 된 함수 변수를 사용하는 것이 가장 좋습니다.

동일한 이름의 이전 함수를 호출하는 새 함수를 작성하는 예 :

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition

이것은 나를 위해 일했다

if( cb && typeof( eval( cb ) ) === "function" ){
    eval( cb + "()" );
}

단선 솔루션 :

function something_cool(text, callback){
    callback && callback();
}

참고 URL : https://stackoverflow.com/questions/85815/how-to-tell-if-a-javascript-function-is-defined

반응형