Тест для неопределенной функции в Javascript - PullRequest
18 голосов
/ 18 мая 2011

Так что Safari продолжает кричать на меня за одну конкретную ошибку.

Я пытаюсь использовать Google Maps API и звоню map.getCenter();.Однако иногда это происходит до полной загрузки map.

Поэтому вместо этого в своей функции я проверяю вызов undefined следующим образом:

if (map.getCenter() != undefined)

Но это все еще ошибкипотому что я думаю, что это даже не нравится звонить, чтобы проверить, если результат undefined или нет?

Могу ли я получить помощь здесь?

Спасибо!

Ответы [ 7 ]

42 голосов
/ 18 мая 2011

Я действительно предпочитаю что-то в этом духе.

if(typeof myfunc == 'function') { 
    myfunc(); 
}

То, что что-то не является неопределенным, не делает его функцией.

29 голосов
/ 18 мая 2011
if (typeof map !== 'undefined' && map.getCenter) {
   // code for both map and map.getCenter exists
} else {
  // if they dont exist
}

Это правильный способ проверки существования функции. Вызов функции для проверки ее существования приведет к ошибке.

ОБНОВЛЕНИЕ: Обновлен фрагмент.

5 голосов
/ 18 мая 2011
if (typeof map.getCenter !== 'undefined')

Не выдаст ошибку.

Итак, еще лучше, if (typeof map.getCenter === 'function') map.getCenter();

4 голосов
/ 18 мая 2011

Технически вы должны тестировать, если map не определено, а не map.getCenter().Вы не можете вызвать функцию по неопределенной ссылке.

Однако, Самоучитель Google предлагает вам вызвать ваш JavaScript, который обращается к API в обработчике body.onload, так что вы делаетене пытаться ссылаться на что-либо, пока все удаленные файлы .js не будут загружены - вы делаете это?Это решило бы проблему навсегда, вместо того, чтобы сбоить, когда ваш JavaScript выполняется до загрузки API.

1 голос
/ 18 мая 2011

У меня недавно была привычка использовать оператор typeof для проверки вещей и типов. Он возвращает тип в виде строки, которая, я думаю, позволяет избежать путаницы с типом ответа.

if( typeof map.getCenter != 'undefined') ...

Я не уверен, что это более правильно, но я нахожу хорошие результаты с этим процессом.

0 голосов
/ 12 июня 2014

Предполагая, что map.getCenter () всегда является функцией, достаточно просто использовать эту проверку:

if (map.getCenter) {
      var x = map.getCenter();
}
0 голосов
/ 18 мая 2011

Вы должны проверить, является ли map неопределенным.В текущей проверке вы все еще пытаетесь выполнить вызов функции.

...