Почему возвращение в «наконец-то» переопределяется «попробовать»?

StackOverflow https://stackoverflow.com/questions/3837994

Вопрос

Как работает оператор возврата внутри блок 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 оценивается следующим образом:

  1. Пусть B является результатом оценки блока.
  2. Пусть F будет результатом оценки окончательно.
  3. Если f.type нормальный, возврат B.
  4. Вернуть Ф.

И от стр. 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);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top