Почему возврат в "finally" переопределяет "try"?
как работает оператор return внутри блока try/catch?
function example() {
try {
return true;
}
finally {
return false;
}
}
Я ожидаю, что выход этой функции будет true, а false!
7 ответов:
наконец-то всегда выполняет. Вот для чего он нужен, а это значит, что его возврат используется в вашем случае.
вы хотите изменить свой код так что это больше похоже на это:
function example() { var returnState = false; // initialisation value is really up to the design try { returnState = true; } catch { returnState = false; } finally { return returnState; } }вообще говоря, вы никогда не хотите иметь более одного оператора return в функции, поэтому такие вещи, как это.
согласно ECMA-262 (5ed, декабрь 2009), в стр. 96:
производства
TryStatement : try Block Finallyвычисляется следующим образом:
- пусть B-результат вычисления блока.
- пусть F-результат окончательной оценки.
- если тип F. нормальный, верните B.
- Возвратить Ф.
и из стр. 36:
тип завершения используется для объяснения поведение высказываний (
break,continue,returnиthrow), которые выполняют нелокальной передачи управления. Значения типа завершения являются тройками формы (тип, значение, цели), где тип один изnormal,break,continue,returnилиthrow,стоимостью любое значение языка ECMAScript или пустое, и цель - это любой идентификатор ECMAScript или пустой.понятно, что
return falseустановить тип завершения наконец-то как return, которые вызываютtry ... finallyсделать 4. Возвращение Ф.
при использовании
finally, любой код в этом блоке срабатывает до выхода метода. Потому что вы используете возврат вfinallyблок, он называетreturn falseи переопределяет предыдущиеreturn trueнаtryблок.(терминология может быть не совсем правильно.)
почему вы получаете false, вы возвращаетесь в блок finally. наконец блок должен выполняться всегда. так что ваш
return trueизмененияreturn falsefunction example() { try { return true; } catch { return false; } }
насколько я знаю,
finallyблок всегда выполняется, независимо от того, есть ли у васreturnинструкцияtryили нет. Следовательно, вы получаете значение, возвращаемоеreturnоператор внутри блока finally.Я проверил это с Firefox 3.6.10 и Chrome 6.0.472.63 как в Ubuntu. Возможно, что этот код может вести себя по-разному в других браузерах.