Почему возвращение в «наконец-то» переопределяется «попробовать»?
-
27-09-2019 - |
Вопрос
Как работает оператор возврата внутри блок Try / Catch?
function example() {
try {
return true;
}
finally {
return false;
}
}
Я ожидаю, что вывод этой функции будет true
, но вместо этого это false
!
Решение
Ну наконец то всегда выполняет. Это то, что это для, это означает, что в вашем случае используется возвращение.
Вы захотите изменить свой код, так что это больше похоже на это:
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
Вообще говоря, вы никогда не хотите иметь более одного оператора возврата в функции, такие вещи, как вот почему.
Другие советы
Согласно ECMA-262 (5ED, декабрь 2009 года), в с. 96:
Производство
TryStatement : try Block Finally
оценивается следующим образом:
- Пусть B является результатом оценки блока.
- Пусть F будет результатом оценки окончательно.
- Если f.type нормальный, возврат B.
- Вернуть Ф.
И от стр. 36:
Тип завершения используется для объяснения поведения утверждений (
break
,continue
,return
а такжеthrow
) которые выполняют нелокальные передачи контроля. Значения типа завершения являются тройки формы (тип, значение, цель), куда тип один изnormal
,break
,continue
,return
, илиthrow
, стоимость это любой язык языка Ecmascript или пустой, а также цель это любой идентификатор Ecmascript или пустой.
Ясно, что return false
установит бы тип завершения наконец так как вернуть, что вызывает try ... finally
сделать 4. Вернуть Ф..
Когда вы используете finally
, Любой код в пределах этого блока пожара перед выходом на метод. Потому что вы используете возврат в finally
блок, это называет return false
и переопределяет предыдущий return true
в try
блокировать.
(Терминология может быть не совсем прав.)
Почему вы получаете ложь, вы вернулись в окончательно блок. Наконец-то блок должен всегда выполняться. Так что ваши return true
изменения к return false
function example() {
try {
return true;
}
catch {
return false;
}
}
Насколько я знаю, finally
блокировать всегда выполняет, независимо от того, есть ли у вас return
Заявление внутри try
или не. Ergo, вы получаете значение, возвращенную return
Заявление внутри, наконец, блок.
Я проверил это с Firefox 3.6.10 и Chrome 6.0.472.63 как в Ubuntu. Возможно, что этот код может вести себя по-разному в других браузерах.
Наконец-то блок переписывает, попробуйте блок возвращается (образно говоря).
Просто хотел указать, что если вы вернетесь от наконец, то он будет возвращен из функции. Но если в наконец, нет «возвращения» слова - будет возвращено значение из блока попробовать;
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
Так -finally- return
Переписать возвращение в return
.
Наконец-то должен всегда работать в конце Blate Blash, чтобы (по спецификации) почему вы получаете ложное возвращение. Имейте в виду, что вполне возможно, что разные браузеры имеют разные реализации.
Что насчет этого?
doubleReturn();
function doubleReturn() {
let sex = 'boy';
try {
return sex;
console.log('this never gets called...');
} catch (e) {} finally {
sex = 'girl';
alert(sex);
}
}