В чём разница между этими двумя функциями?

Рейтинг: 1Ответов: 2Опубликовано: 08.08.2023

В чём разница между функциональным выражением (в первом случае) и функцией (во втором случае) в блоке try? Почему при попытке выполнения кода, как в первом случае, выдаётся ошибка, но не выполняется блок catch, а во втором случае - код выполняется корректно?

try {
  function() {
    return 2 + 2
  }
} catch (err) {
  console.log('Поймана ошибка!')
}


try {
  function fn() {
    return 2 + 2
  }
} catch (err) {
  console.log('Поймана ошибка!')
}

Ответы

▲ 1Принят

В первом случае, функция является анонимной и является частью функционального выражения. Когда происходит ошибка на этапе выполнения кода в блоке try, эта ошибка не перехватывается блоком catch, потому что ошибка не возникает в самом блоке try, а возникает при определении функции.

Во втором случае, функция именована (fn) и просто определяется в блоке try. Когда код в блоке try успешно выполняется, ошибки нет и блок catch не выполняется.

Оба случая могут вызвать ошибку во время выполнения кода, но только во втором случае блок catch будет выполняться, если возникнет ошибка.

▲ 0

В первом случае код не выполнится. И это правильно, потому как он не имеет смысла: объявляется анонимная функция, которая не вызывается сразу и её нельзя вызвать извне (из-за анонимности, т.е. отсутствия имени).

Во втором случае, как верно сказал @exord - объявляется функция с именем fn, но не вызывается.

Если нужно вызвать анонимную функцию в блоке try, то функцию можно обернуть в скобки и добавить скобки после:

try {
  (function() {
    test
  })();
} catch (err) {
  console.log('Поймана ошибка! ' + err)
}