Как работает оператор return внутри блока try/catch?
function example() {
try {
return true;
}
finally {
return false;
}
}
Я ожидаю, что выход этой функции будет "true", но вместо этого "false"!
Как работает оператор return внутри блока 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;
}
}
Вообще говоря, вы никогда не хотите иметь более одного оператора return в функции, вот почему.
Согласно ECMA-262 (5ед, декабрь 2009 г.), стр. 96:
Произведение
TryStatement : try Block Finally
оценивается следующим образом:
- Пусть B - результат оценки блока.
- Пусть F является результатом оценки Наконец.
- Если F.type является нормальным, верните B.
- Возврат F.
И из стр. 36:
Тип завершения используется для объяснения поведения операторов (
break
,continue
,return
иthrow
), которые выполняют нелокальные передачи управления. Значения типа "Завершение" - это тройки формы (тип, значение, цель), где тип - один изnormal
,break
,continue
,return
илиthrow
, значение - любое значение языка ECMAScript или пустым, а целью является любой идентификатор ECMAScript или пустой.
Ясно, что return false
задает тип завершения в конце как return, что приведет к выполнению try ... finally
4. Верните F.
Когда вы используете finally
, любой код внутри этого блока срабатывает до выхода метода. Поскольку вы используете возврат в блоке finally
, он вызывает return false
и переопределяет предыдущий return true
в блоке try
.
(Терминология может быть не совсем правильной.)
почему вы получаете false, вы вернулись в блок finally. блок finally должен выполняться всегда. поэтому ваш return true
изменяется на return false
function example() {
try {
return true;
}
catch {
return false;
}
}
Насколько мне известно, выполняется finally
блок всегда, независимо от того, есть ли оператор return
внутри try
или нет. Ergo, вы получите значение, возвращаемое оператором return
внутри блока finally.
Я тестировал это с Firefox 3.6.10 и Chrome 6.0.472.63 как в Ubuntu. Возможно, этот код может вести себя по-другому в других браузерах.
Наконец, предполагается, что ALWAYS запускается в конце блока catch try, поэтому (по спецификации) является причиной, по которой вы получаете false. Имейте в виду, что вполне возможно, что разные браузеры имеют разные реализации.