Как проверить, существует ли функция в JavaScript? - PullRequest
451 голосов
/ 25 июня 2009

Я следовал этому руководству , чтобы создать новый 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?

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

Ответы [ 26 ]

1047 голосов
/ 25 июня 2009

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

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

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

if (typeof me.onChange === "function") { 
    // safe to use the function
}
97 голосов
/ 07 февраля 2013

У меня была эта проблема.

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

продолжал выдавать ошибку ссылки, если obj оказался неопределенным.

В итоге я сделал следующее:

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

Коллега указал мне, что проверка, если это !== 'undefined', а затем === 'function', конечно, избыточна.

Simpler:

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

Много чище и прекрасно работает.

17 голосов
/ 28 мая 2011

Если вы используете eval для преобразования строки в функцию и хотите проверить, существует ли этот метод eval'd, вам нужно использовать typeof и строку вашей функции внутри Eval

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

Не переворачивайте это и попробуйте typeof на eval . Если вы сделаете ReferenceError, будет выдано:

var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
9 голосов
/ 10 февраля 2015

Как насчет:

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 документы .

8 голосов
/ 15 августа 2013

Попробуйте typeof - ищите 'undefined', чтобы сказать, что его не существует, 'function' для функции. JSFiddle для этого кода

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

Или как будто:

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
7 голосов
/ 18 января 2016

Не видел это предложил: me.onChange && me.onChange (str);

Обычно, если me.onChange не определен (что будет, если он не был инициирован), он не выполнит последнюю часть Если me.onChange является функцией, она выполнит me.onChange (str).

Вы можете даже пойти дальше и сделать:

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

на случай, если я тоже асинхронен.

4 голосов
/ 23 апреля 2015
//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");
    }
4 голосов
/ 25 июня 2009

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

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}
3 голосов
/ 27 августа 2018

Для меня самый простой способ:

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}
3 голосов
/ 18 февраля 2016

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

typeof obj == 'function' || false

http://underscorejs.org/docs/underscore.html#section-143

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...