Подтвердить что ты не робот

Javascript: try/catch return statement

Как работает оператор return внутри блока try/catch?

function example() {
    try {
        return true;
    }
    finally {
        return false;
    }
}

Я ожидаю, что выход этой функции будет "true", но вместо этого "false"!

4b9b3361

Ответ 1

Наконец, всегда выполняется. То, что это значит, что означает, что он возвращается, будет использоваться в вашем случае.

Вы захотите изменить свой код, чтобы он выглядел следующим образом:

function example() { 
    var returnState = false; // initialisation value is really up to the design
    try { 
        returnState = true; 
    } 
    catch {
        returnState = false;
    }
    finally { 
        return returnState; 
    } 
} 

Вообще говоря, вы никогда не хотите иметь более одного оператора return в функции, вот почему.

Ответ 2

Согласно 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.

Ответ 3

Когда вы используете finally, любой код внутри этого блока срабатывает до выхода метода. Поскольку вы используете возврат в блоке finally, он вызывает return false и переопределяет предыдущий return true в блоке try.

(Терминология может быть не совсем правильной.)

Ответ 4

почему вы получаете false, вы вернулись в блок finally. блок finally должен выполняться всегда. поэтому ваш return true изменяется на return false

function example() {
    try {
        return true;
    }
    catch {
        return false;
    }
}

Ответ 5

Насколько мне известно, выполняется finally блок всегда, независимо от того, есть ли оператор return внутри try или нет. Ergo, вы получите значение, возвращаемое оператором return внутри блока finally.

Я тестировал это с Firefox 3.6.10 и Chrome 6.0.472.63 как в Ubuntu. Возможно, этот код может вести себя по-другому в других браузерах.

Ответ 6

Наконец, предполагается, что ALWAYS запускается в конце блока catch try, поэтому (по спецификации) является причиной, по которой вы получаете false. Имейте в виду, что вполне возможно, что разные браузеры имеют разные реализации.