JavaScript에 함수가 있는지 확인하는 방법?


533

내 코드는

function getID( swfID ){
     if(navigator.appName.indexOf("Microsoft") != -1){
          me = window[swfID];
     }else{
          me = document[swfID];
     }
}

function js_to_as( str ){
     me.onChange(str);
}

그러나 때로는 내 onChange로드되지 않습니다. 다음과 같은 Firebug 오류

me.onChange는 함수가 아닙니다

이것이 내 프로그램에서 가장 중요한 기능이 아니기 때문에 정상적으로 저하되고 싶습니다. typeof같은 오류가 발생합니다.

그것이 존재하는지 확인한 다음 실행하는 방법에 대한 제안 onChange?

(아래의 방법 중 하나만 시도해보십시오)


1
@SteveChambers 내가 그 일을했습니다. 나를 상기시켜 주셔서 감사합니다.
Alec Smart


예외를 잡아라. 내 답변 확인
Matteus Barbosa

답변:


1224

다음과 같이 해보십시오 :

if (typeof me.onChange !== "undefined") { 
    // safe to use the function
}

또는 더 나은 아직 (UpTheCreek의 의견에 따라)

if (typeof me.onChange === "function") { 
    // safe to use the function
}

249
=== 'function'이! = 'undefined'보다 낫습니다
UpTheCreek

3
@James, 그 문장은 실제로 undefinedJavaScript에서 예외를 던지기 때문입니다 . 나는 그것을 시도했다.
Mike Perrenoud

8
@UpTheCreek, 이전 버전의 IE는 특정 기능을 객체로 취급하기 때문에 일반적인 솔루션으로 약간 위험 typeof window.alert === 'object'합니다.
Noyo

1
왜 사용하지 if (me.onChange) { // do something }않습니까?
BornToCode

3
@BornToCode는 반드시 함수일 필요는없는 me.onChange것으로 평가할 수 있기 때문입니다 true(예 : 부울, 문자열 등일 수 있음 ). 예를 들어 jsfiddle.net/j5KAF/1
Ohad Schneider

108

나는이 문제가 있었다.

if (obj && typeof obj === 'function') { ... }

obj가 정의되지 않은 경우 참조 오류가 계속 발생합니다.

결국 나는 다음을 수행했다.

if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }

동료는인지 확인 나에게 지적 !== 'undefined'다음과 것은 === 'function'물론 중복됩니다.

더 간단하게 :

if (typeof obj === 'function') { ... }

훨씬 깨끗하고 잘 작동합니다.


1
누구나 첫 번째 코드 스 니펫이 발생하는 이유를 알고 ReferenceError있습니까? 그것은 나에게 비논리적 인 것처럼 보인다.
saidfagan


이것은 나를 위해 작동합니다
NewBie1234

1
typeof obj == 'function'이 부족한 동기는 무엇입니까? ;-)주의 사항 : 엄격한 동등성 테스트 연산자는 정적 피연산자가 비어 있거나 null이거나 0이거나 이와 같은 캐스트 아말 게임에 종속 된 경우에만 의미가 있습니다.
Fabien Haddadi

16

eval을 사용하여 문자열을 함수로 변환 하고이 evald 메소드가 존재하는지 확인하려는 경우 eval 내에서 typeof 및 함수 문자열 을 사용하려고합니다 .

var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"

이것을 바꾸지 말고 eval에 typeof 를 시도하십시오 . ReferenceError를 수행하면 다음이 발생합니다.

var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined

21
eval == evil;)
Yeti

1
악의적 일 수 있지만 함수 이름이 변수에있을 때 매우 유용합니다.
Luke Cousins

8
eval 없이이 작업을 수행 할 수 있습니다. 예 :var a = 'alert'; window[a]('it works');
zennin

15

어때요?

if('functionName' in Obj){
    //code
}

예 :

var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false

또는 귀하의 경우 :

if('onChange' in me){
    //code
}

MDN 문서를 참조하십시오 .


내가이 알고 싶다면하지만이 솔루션은 예를 들어 매번 :( 작동하지 않습니다 lastIndexOf()(우리가 즉, 알고 있지만, 이론적으로) 문자열 typeof String().lastIndexOf === "function"은 사실이지만 'lastIndexOf' in String. 거짓
IIIC

10

시도 typeof- 'undefined'존재하지 않는 'function'기능 을 찾으십시오 . 이 코드에 대한 JSFiddle

function thisishere() {
    return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);

또는 if :

if (typeof thisishere === 'function') {
    // function exists
}

또는 한 줄에 반환 값이있는 경우 :

var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false

9

이것이 제안 된 것을 보지 못했다 : me.onChange && me.onChange (str);

기본적으로 me.onChange가 정의되지 않은 경우 (시작되지 않은 경우) 후자를 실행하지 않습니다. me.onChange가 함수이면 me.onChange (str)가 실행됩니다.

더 나아가서 할 수도 있습니다.

me && me.onChange && me.onChange(str);

나도 비동기 인 경우.


5
//Simple function that will tell if the function is defined or not
function is_function(func) {
    return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}

//usage

if (is_function("myFunction") {
        alert("myFunction defined");
    } else {
        alert("myFunction not defined");
    }

jQUery를 포함하고 있기 때문에 귀하의 솔루션은 명확하지 않습니다.
T.Todua

@tazotodua 자체 설명 기능입니다. jquery없이 사용하려면 && 부분을 제거하십시오. 이는 오류를 확인하고 피하기위한 추가 조건입니다.
무하마드 타히르

왼쪽의 조건 &&이 jQuery의 isFunction오른쪽 에없는 무언가를 처리 &&합니까?
SantiBailors 2016 년

5

나를 위해 가장 쉬운 방법 :

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}

이것은 문자열 답답하기 때문에 정답입니다.. 이렇게 말하면 if ((typeof window["function_name"] !== 'undefined') && ((typeof window["function_name"] === 'function'))) { return true; } else { return false; }
좋겠지 만

4

속성이 실제로 함수인지 확인하기 위해 1 단계 더 나아가겠습니다.

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}

3
function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}

3

이 방법을 사용하는 것이 좋습니다.

function isFunction(functionToCheck) {
  var getType = {};
  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}

용법:

if ( isFunction(me.onChange) ) {
    me.onChange(str); // call the function with params
}


3
function function_exists(function_name)
{
    return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));

또는

function function_exists(func_name) {
  //  discuss at: http://phpjs.org/functions/function_exists/
  // original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: Steve Clay
  // improved by: Legaev Andrey
  // improved by: Brett Zamir (http://brett-zamir.me)
  //   example 1: function_exists('isFinite');
  //   returns 1: true

  if (typeof func_name === 'string') {
    func_name = this.window[func_name];
  }
  return typeof func_name === 'function';
}

1
설명 좀 해주세요
Gufran Hasan

이가지 경우에, 단순히 전화 function_exists을 존재를 확인하는 함수 매개 변수의 이름으로, 반환 bool에.
Mohammad Lotfi

3

느낌표 두 개를 넣으십시오. 확인하려는 기능 이름 앞에. 존재하면 true를 리턴합니다.

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false

3

몇 마디로 예외를 잡아라.

이 게시물에서 아직 예외 캐치에 대해 아무도 대답하거나 댓글을 달지 않은 것에 놀랐습니다.

세부 정보 : 여기에 mask_ 접두사가 붙고 양식 필드 "name"이 접미사로 붙인 함수를 일치시키는 예제가 있습니다. JavaScript가 함수를 찾지 못하면 catch 섹션에서 원하는대로 처리 할 수 있는 ReferenceError를 발생 시켜야 합니다.

function inputMask(input) {
  try {
    let maskedInput = eval("mask_"+input.name);

    if(typeof maskedInput === "undefined")
        return input.value;
    else
        return eval("mask_"+input.name)(input);

  } catch(e) {
    if (e instanceof ReferenceError) {
      return input.value;
    }
  }
}


2

조건없이

me.onChange=function(){};

function getID( swfID ){
     if(navigator.appName.indexOf("Microsoft") != -1){
          me = window[swfID];
     }else{
          me = document[swfID];
     }
}

function js_to_as( str ){
     me.onChange(str);
}

2

온로드 me가 올바르게 할당되지 않은 것 같습니다 .

get_ID 호출을 onclick 이벤트로 이동하면 처리해야합니다.

분명히 앞에서 언급 한대로 더 덫을 놓을 수 있습니다.

function js_to_as( str) {
  var me = get_ID('jsExample');
  if (me && me.onChange) {
    me.onChange(str);
  }
}

2

나는 항상 이렇게 확인 :

if(!myFunction){return false;}

이 함수를 사용하는 코드 앞에 배치하십시오.


2

함수 이름에 추가 된 변수 (이 경우 var 'x')에 따라 함수 이름이 다른 경우가있었습니다. 이것은 작동합니다 :

if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); } 


2

나는 대답을 시도했다; 하나:

console.log(typeof me.onChange);

'undefined'를 반환합니다. 사양에 'onChange'대신 'onchange'라는 이벤트가 나타납니다 (카멜 케이스에주의하십시오).

원래 수락 된 답변을 다음으로 변경하면 나에게 도움이되었습니다.

if (typeof me.onchange === "function") { 
  // safe to use the function
}

2

jQuery 플러그인 인 함수를 확인하려면 $ .fn.myfunction을 사용해야합니다.

if (typeof $.fn.mask === 'function') {
    $('.zip').mask('00000');
}

2

또한이 문제에 대한 우아한 해결책을 찾고 있습니다. 많은 성찰 끝에이 방법이 가장 좋습니다.

const func = me.onChange || (str => {}); func(str);


minimalizm을 사용 (me.onChange||(_=>_))()하려는 경우 다음을 수행 할 수도 있습니다 . 함수가 존재하면 함수를 실행하고 그렇지 않으면 아무 것도 수행하지 않습니다.
JSideris

me.onChange && me.onChange()void 함수 정의를 방지하는 것이 좋습니다 .
necrifede

2

구조에 현대 자바 스크립트!

긴 답변 목록으로 볼 가능성은 크지 않지만 이제 새로운 선택적 체인 구문으로 언어 수준에서 해결됩니다 *.

me.onChange?.(str)

onChange존재하는 경우 호출 되는 것처럼 간단 합니다 .

만약 onChange존재하지 않는 아무 일도 일어나지 않고 표현식이 리턴합니다 undefined. 따라서 다른 값을 사용하는 리턴 값이있는 경우 !== undefined계속하기 전에이 값을 확인하면 됩니다.

에지의 경우주의 - 경우 onChange 않습니다 존재를하지만입니다 하지 함수, 당신이 얻을 TypeError. 이것은 예상 한대로 함수가 아닌 함수를 함수로 호출하는 것과 동일하지만 Optional Chaining 은이를 멀리하기 위해 마술을하지 않는다는 것을 명시 적으로 지적 할 가치가 있습니다.

* 기술적으로 말하면, 옵션 체인은 아직 단계 4 TC39 제안 이므로 아직 ECMAScript 사양에 포함되어 있지 않지만 단계 4는 최종 버전이며 포함이 본질적으로 보장됨을 의미하며 새로운 버전이 출시되기를 기다리고 있습니다. Babel을 통해 오늘 최종 버전에서 구문을 사용할 수 있습니다. 심지어 Typescript에도 있습니다!


1

다음은 함수의 존재 를 확인 하고 해당 함수를 동적으로 트리거 하기위한 효과적이고 간단한 솔루션입니다. 다른 기능으로는;

트리거 기능

function runDynamicFunction(functionname){ 

    if (typeof window[functionname] == "function") { //check availability

        window[functionname]("this is from the function it"); // run function and pass a parameter to it
    }
}

그리고 지금 이런 PHP를 사용하여 동적으로 함수를 생성 할 수 있습니다

function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}

이제 동적으로 생성 된 이벤트를 사용하여 함수를 호출 할 수 있습니다

<?php

$name_frm_somware ="runThis_func";

echo "<input type='button' value='Button' onclick='runDynamicFunction(\"".$name_frm_somware."\");'>";

?>

필요한 정확한 HTML 코드는

<input type="button" value="Button" onclick="runDynamicFunction('runThis_func');">

0
    function sum(nb1,nb2){

       return nb1+nb2;
    }

    try{

      if(sum() != undefined){/*test if the function is defined before call it*/

        sum(3,5);               /*once the function is exist you can call it */

      }

    }catch(e){

      console.log("function not defined");/*the function is not defined or does not exists*/
    }

0

그리고이게 ...

( document.exitPointerLock || Function )();

안녕하세요 스승님,하지만 예외를 잡는 것에 대해 어떻게 생각하십니까? 내 답변 확인
Matteus Barbosa

메모 주셔서 감사합니다. 당신의 솔루션은 훌륭합니다. 가능한 한 쉽게 또는 쉽게 제 3 자 원조에 의해 암시 / 부과 된 'try-catch'패러다임을 피하려고합니다. 'Eval'은 여러 가지 이유로 인해 다른 래퍼와 비슷한 시간이 걸리기 때문에 눈살을 찌푸립니다. '발굴'될 수도있는 평가 대안이 있습니다. 나는 '새로운 기능 (parms, body)'이 오류를 던질 것이라고 생각하지만 다음 질문은 속도 비교, 다른 최고의 코드 크기 축소 (나에게 더 빠름)입니다. 흠. 나는 그것을 시도하지 않았다 jsben.ch]
마스터 제임스

대신 새로운 함수를 호출하는 것에 대한 흥미로운 점이 있습니다. 내 답변에 변경 제안을 제출하십시오. 고마워요
Matteus Barbosa

나중에 'source myScript.sh'를 사용하는 bash에서도 별칭 등을 통해 '내보내기'할 수 있습니다. 클래스와 라이브러리는 항상 모든 코드의 고유 속성이었습니다. 제재되지 않은 경우 JS 인터프리터 검사 코드가 있어야합니다. 나는 하나의 함수로 하나를 만들었습니다. 이것은 코드의 가장 간단한 공리적 특성을 이해하는 데 도움이되는 또 다른 재미있는 도전이며 런타임조차도 다른 사람의 능력을 넘어서는 것은 아닙니다.
마스터 제임스

0

이거 한번 해봐:

Window.function_exists=function(function_name,scope){
//Setting default scope of none is provided
If(typeof scope === 'undefined') scope=window;
//Checking if function name is defined
If (typeof function_name === 'undefined') throw new 
Error('You have to provide an valid function name!');
//The type container
var fn= (typeof scope[function_name]);
//Function type
If(fn === 'function') return true;
//Function object type
if(fn.indexOf('function')!== false) return true; 
return false;
}

휴대폰으로 작성했음을 유의하십시오. 예를 들어 함수 이름과 같은 일부 대문자 문제 및 / 또는 기타 수정 사항이 포함될 수 있습니다.

PHP와 같은 함수가 var가 설정되어 있는지 확인하려면 다음을 수행하십시오.

Window.isset=function (variable_con){
If(typeof variable_con !== 'undefined') return true;
return false;
}

0

위의 답변을 설명하기 위해 빠른 JSFiddle 스 니펫은 다음과 같습니다.

function test () {
console.log()

}

console.log(typeof test) // >> "function"

// implicit test, in javascript if an entity exist it returns implcitly true unless the element value is false as :
// var test = false
if(test){ console.log(true)}
else{console.log(false)}

// test by the typeof method
if( typeof test === "function"){ console.log(true)}
else{console.log(false)}


// confirm that the test is effective : 
// - entity with false value
var test2 = false
if(test2){ console.log(true)}
else{console.log(false)}

// confirm that the test is effective :
// - typeof entity
if( typeof test ==="foo"){ console.log(true)}
else{console.log(false)}

/* Expected :
function
true 
true 
false
false
*/


0
// just pass your tested function name instead of myFunctionName
if ( $.isFunction($.fn.myFunctionName) ) {
    console.log( 'write your code here.' );
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.