Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чи виконається finally, якщо в try є return?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Це один з найчастіших "підводних каменів" у JavaScript. Відповідь - так, блок **`finally`** завжди виконується, навіть якщо всередині `try` є `return`. **Ключове:** `finally` виконується перед тим, як функція фактично поверне значення чи прокине виняток.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняЦе один з найчастіших "підводних каменів" у JavaScript! Відповідь - **так**, блок `finally` **завжди виконується**, навіть якщо всередині `try` є `return`. --- ## Загальне правило > Незалежно від того, **чи була помилка**, **чи був return**, **чи був throw**, > блок `finally` **гарантовано виконається перед виходом із функції**. --- ## Приклад 1. `return` усередині `try` ```javascript function test() { try { console.log("Всередині try"); return "Значення з try"; } finally { console.log("Блок finally все одно виконається"); } } console.log("Результат:", test()); ``` Вивід: ```javascript Всередині try Блок finally все одно виконається Результат: Значення з try ``` Видно, що: 1. Спочатку виконується код усередині `try`. 2. Потім **перед поверненням значення** викликається `finally`. 3. Лише після цього функція повертає результат. --- ## Приклад 2. `return` і `throw` усередині try ```javascript function example() { try { console.log("Перед поверненням"); return "Повернення з try"; } catch { console.log("catch не викличеться"); } finally { console.log("finally все одно виконується"); } } console.log(example()); ``` Вивід: ```javascript Перед поверненням finally все одно виконується Повернення з try ``` --- ## Приклад 3. `return` і помилка: `finally` все одно спрацьовує ```javascript function example() { try { throw new Error("Помилка в try"); } catch (e) { console.log("Впіймали:", e.message); return "Повернення з catch"; } finally { console.log("finally все одно виконується"); } } console.log(example()); ``` Вивід: ```javascript Впіймали: Помилка в try finally все одно виконується Повернення з catch ``` --- ## Приклад 4. `finally` може **перевизначити return** Якщо всередині `finally` теж є `return`, він **замінить** результат, який повертався з `try` або `catch`. ```javascript function example() { try { return "З try"; } finally { return "З finally"; } } console.log(example()); ``` Вивід: ```javascript З finally ``` Тому **додавати** `return` **у finally - погана практика**, бо це робить поведінку функції непередбачуваною. --- ## Приклад 5. Навіть при помилці `finally` виконається ```javascript function example() { try { throw new Error("Помилка!"); } finally { console.log("finally відпрацює навіть при помилці"); } } example(); // Uncaught Error: Помилка! ``` Вивід: ```javascript finally відпрацює навіть при помилці Uncaught Error: Помилка! ``` --- ## Підсумок | Сценарій | Виконається finally? | Що станеться | |---|---|---| | Помилок немає | Так | Після `try` | | Є помилка | Так | Після `catch` | | Є `return` у `try` | Так | Перед виходом із функції | | Є `return` у `catch` | Так | Перед виходом із функції | | Є `throw` | Так | Перед викидом винятку | | Є `return` у `finally` | Так, і **перезапише** результат | |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.