Как проверить, существует ли функция в JavaScript?

Я следовал этому руководству , чтобы создать новый JS для флэш-связи.

Мой код

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?

(Ни один из методов ниже, за исключением попытки поймать одну работу)

459
задан piperchester 9 December 2017 в 00:59
поделиться

9 ответов

Попробуйте что-нибудь вроде этого:

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

или еще лучше (согласно комментариям UpTheCreek)

if (typeof me.onChange === "function") { 
    // safe to use the function
}
1116
ответ дан 22 November 2019 в 22:45
поделиться

У меня был случай, когда имя функции менялось в зависимости от переменной (в данном случае var 'x'), добавленной к имени функции. Это работает:

if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); } 
2
ответ дан Sebastian H 9 December 2017 в 00:59
поделиться

Библиотека Underscore.js определяет его в методе isFunction следующим образом (что, как предполагают комментарии, может исправить некоторые ошибки браузера)

typeof obj == 'function' || false

http://underscorejs.org/docs/underscore .html # раздел-143

3
ответ дан PandaWood 9 December 2017 в 00:59
поделиться

Я также искал изящное решение этой проблемы. После большого отражения я нашел этот подход лучше всего.

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

1
ответ дан 22 November 2019 в 22:45
поделиться

В нескольких словах: Поймайте Исключение.

я действительно удивлен, что никто не ответил или прокомментировал об Исключении, Завоевывают популярность это сообщение все же.

Деталь: функция ниже является примером от моей кодовой базы. Когда JavaScript не находит функцию, он должен бросить 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;
    }
  }

}
0
ответ дан 22 November 2019 в 22:45
поделиться

I would suspect that me is not getting correctly assigned onload.

Moving the get_ID call into the onclick event should take care of it.

Obviously you can further trap as previously mentioned:

function js_to_as( str) {
  var me = get_ID('jsExample');
  if (me && me.onChange) {
    me.onChange(str);
  }
}
2
ответ дан 22 November 2019 в 22:45
поделиться

Без условий

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
ответ дан 22 November 2019 в 22:45
поделиться

Я сделаю еще один шаг, чтобы убедиться, что свойство действительно является функцией

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}
4
ответ дан 22 November 2019 в 22:45
поделиться
function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}
2
ответ дан 22 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: