#javascript #try-catch
#javascript #try-catch
Вопрос:
Следующий оператор используется, потому что рассматриваемый метод (refreshPartyList() ) не всегда может быть определен.
try {
parent.document.getElementById("myId").contentWindow.refreshPartyList(param1, param2);
}catch(e){}
В настоящее время используется описанный выше подход, и он работает нормально, но есть ли лучшая альтернатива?
Ответ №1:
var e = parent.document.getElementById("myId").contentWindow;
if(e.refreshPartyList)
e.refreshPartyList(param1, param2);
Комментарии:
1. Мне это кажется простым. При правильном выполнении try / catch иногда может содержать меньше кода и быть проще для чтения, но это простое
if
утверждение должно работать нормально, если вы не хотите try / catch .2. @jfriend00 вы пытаетесь оправдать try / catch, потому что в нем «меньше кода», хотя а) есть пустой блок catch и б) это огромные издержки производительности?
3. @Raynos — Этот пример настолько прост, что я бы не стал использовать try / catch, но я видел код, который состоял из нескольких страниц и был усеян 50
if
операторами, которые могли быть окружены одним единственным try / catch и безif
операторов. В общем случае try / catch недостаточно используется в программировании на JS. Это не для каждой ситуации, но есть много хороших ситуаций, когда мало кто ее использует. Это все, на что я пытался указать.4. @jfriend00 и ваше предложение об одной большой попытке / уловке для замены 50 операторов if когда- либо было хорошей идеей?
5. @Raynos — да, одна попытка / перехват может быть очень полезной вместо того, чтобы тестировать целую кучу условий, если ваша функция по сути работает / не работает (например, go, если вы можете, в противном случае просто пропустите выполнение функции). Почему это было бы плохо?
Ответ №2:
Вы можете проверить, существует ли метод с помощью простого if:
if (parent.document.getElementById("myId").contentWindow.refreshPartyList) {
parent.document.getElementById("myId").contentWindow.refreshPartyList(param1, param2);
}
Или, что еще лучше, с помощью jQuery (потому if
что не гарантирует, что это функция):
if (jQuery.type(parent.document.getElementById("myId").contentWindow.refreshPartyList) == 'function') {
Комментарии:
1. Если вы используете jQuery, то она доступна, и x.метод может не быть вызываемой функцией. (и голосование за это — вау!)
2. основной минус заключается в использовании
jQuery.type
вместоtypeof
. Это просто эпическое злоупотребление библиотекой.3. 1 за то, что отметил, что другие методы приводят к сбою, если
refreshPartyList
это не функция. Ну вот, теперь ваш отрицательный голос смещен.4. @Raynos:
typeof
не совсем надежно указывать, что такое функция. Хотя вы можете иметь в виду, что она возвращается'undefined'
, если переменная не существует, что является надежным.5. @Raynos — typeof надежен только для собственных функций, он абсолютно ненадежен для методов хоста. И да, проверка типов jQuery эквивалентна typeof, поэтому бесполезна для объектов хоста.
Ответ №3:
var win = parent.document.getElementById("myId").contentWindow;
win.refreshPartyList amp;amp; win.refreshPartyList(param1, param2);
Используется x.method amp;amp; x.method(...)
для проверки, существует ли метод.
Комментарии:
1. Мне нравится более короткий синтаксис, который допускал бы всего две строки, но использование вычисления короткого замыкания всегда казалось чуть более неясным. 🙂