your programing

왜`finally`의 리턴이`try`보다 우선합니까?

lovepro 2020. 10. 12. 07:59
반응형

왜`finally`의 리턴이`try`보다 우선합니까?


try / catch 블록 내부의 return 문은 어떻게 작동합니까?

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 (2009 년 12 월 5 일)에 따르면 96 페이지 :

생산 TryStatement : try Block Finally은 다음과 같이 평가됩니다.

  1. B를 Block을 평가 한 결과라고하자.
  2. F를 마지막으로 평가 한 결과라고합시다.
  3. F.type이 정상이면 B를 반환합니다.
  4. F를 반환합니다.

그리고 pp. 36에서 :

완료 타입 (명령문의 동작을 설명하는 데 사용되는 break, continue, returnthrow제어 비 로컬 전송을 수행). 완료 유형의 값이 형태의 트리플이다 (타입 값, 타겟) , 유형 중 하나 인 normal, break, continue, return, 또는 throw, 값이 임의 인 ECMAScript 언어 값 또는 빈이며, 타겟은 임의의 ECMAScript를 식별자 또는 빈이다.

그것은 그 분명 return false완료 유형을 설정합니다 마지막 으로 반환 유발 try ... finally4. 반환 F를 .


를 사용 finally하면 메서드가 종료되기 전에 해당 블록 내의 모든 코드가 실행됩니다. finally블록 에서 리턴을 사용하기 때문에 블록 return false에서 이전 return true호출 하고 재정의합니다 try.

(용어가 정확하지 않을 수 있습니다.)


왜 당신이 거짓인지는 finally 블록에서 반환됩니다. finally 블록은 항상 실행되어야합니다. 그래서 당신의 return true변경return false

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

내가 아는 한 finally블록 return 내부 명령문 이 있는지 여부에 관계없이 항상 실행 try됩니다. Ergo, returnfinally 블록 내부 문에서 반환 된 값을 얻습니다 .

나는 Ubuntu에서 Firefox 3.6.10과 Chrome 6.0.472.63으로 이것을 테스트했습니다. 이 코드는 다른 브라우저에서 다르게 작동 할 수 있습니다.


finally 블록은 try 블록 반환을 다시 작성합니다 (비상 적으로 말하면).

마지막으로 무언가를 반환하면 함수에서 반환된다는 점을 지적하고 싶었습니다. 그러나 마지막으로 'return'단어가 없으면 try 블록에서 값을 반환합니다.

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

그래서 return-finally-는 -try-의 반환을 다시 작성합니다 return.


마지막으로 try catch 블록의 끝에서 항상 실행되어 (사양에 따라) false가 반환되는 이유입니다. 브라우저마다 구현이 다를 수 있다는 점을 명심하십시오.


이건 어때?

doubleReturn();

function doubleReturn() {
  let sex = 'boy';

  try {
    return sex;

    console.log('this never gets called...');
  } catch (e) {} finally {
    sex = 'girl'; 

    alert(sex);
  }
}

참고 URL : https://stackoverflow.com/questions/3837994/why-does-a-return-in-finally-override-try

반응형