У меня есть подозрение, что я неправильно использую блок finally, и что я не понимаю основ его назначения ...
function myFunc() {
try {
if (true) {
throw "An error";
}
} catch (e) {
alert (e);
return false;
} finally {
return true;
}
}
Эта функция запустит блок catch, выдаст предупреждение «Ошибка», но затем вернет истину. Почему не возвращается false?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


The finally block contains statements to execute after the try and catch blocks execute but before the statements following the try...catch statement. The finally block executes whether or not an exception is thrown. If an exception is thrown, the statements in the finally block execute even if no catch block handles the exception. more
Блок finally будет работать всегда, попробуйте вернуть true после блока try
function myFunc() {
try {
if (true) {
throw "An error";
}
return true;
} catch (e) {
alert (e);
return false;
} finally {
//do cleanup, etc here
}
}
Блоки finally выполняются, когда вы покидаете блок try. В вашем коде это происходит, когда вы возвращаете false. Это устанавливает возвращаемое значение false и пытается выйти из функции. Но сначала он должен выйти из блока try, который запускает finally и перезаписывает возвращаемое значение на true.
Многие считают хорошей практикой программирования иметь один оператор возврата для каждой функции. Подумайте о том, чтобы сделать var retval в начале вашей функции и установить для него значение true или false, в зависимости от ситуации, во всей функции, а затем структурировать код так, чтобы он правильно переходил к единственному возврату внизу.
Это заявление о возврате вверху предельно ясно. Заставлять всю функцию располагаться внутри if-блока просто не нужно.
function getTheFinallyBlockPoint(someValue) {
var result;
try {
if (someValue === 1) {
throw new Error("Don't you know that '1' is not an option here?");
}
result = someValue
} catch (e) {
console.info(e.toString());
throw e;
} finally {
console.info("I'll write this no matter what!!!");
}
return result;
};
getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);
Запустите это на консоли своего браузера, и он может дать вам ответ, который вы ищете.
Использование одного возвращаемого значения - одна из действенных и полезных стратегий для решения проблемы упрощения цели и ясности функций. Использование переменной для хранения возвращаемого значения также является допустимым средством решения сложной логики возвращаемого значения. Однако я не думаю, что можно сказать, что несколько операторов return в функции автоматически являются признаком плохой практики программирования. Во многих случаях это просто прекрасно: проще писать код и ясно передавать намерения функции следующему программисту, который должен это понимать.
function a(i) {if (i===undefined) {return;} ...}