왜`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
은 다음과 같이 평가됩니다.
- B를 Block을 평가 한 결과라고하자.
- F를 마지막으로 평가 한 결과라고합시다.
- F.type이 정상이면 B를 반환합니다.
- F를 반환합니다.
그리고 pp. 36에서 :
완료 타입 (명령문의 동작을 설명하는 데 사용되는
break
,continue
,return
및throw
제어 비 로컬 전송을 수행). 완료 유형의 값이 형태의 트리플이다 (타입 값, 타겟) , 유형 중 하나 인normal
,break
,continue
,return
, 또는throw
, 값이 임의 인 ECMAScript 언어 값 또는 빈이며, 타겟은 임의의 ECMAScript를 식별자 또는 빈이다.
그것은 그 분명 return false
완료 유형을 설정합니다 마지막 으로 반환 유발 try ... finally
할 4. 반환 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, return
finally 블록 내부 의 문에서 반환 된 값을 얻습니다 .
나는 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
'your programing' 카테고리의 다른 글
HashMap은 다른 키에 대해 스레드로부터 안전합니까? (0) | 2020.10.12 |
---|---|
혼란스러운 템플릿 오류 (0) | 2020.10.12 |
Promise.all (). then () 해결? (0) | 2020.10.12 |
Python-virtualenv를 사용하여 수동으로 패키지 설치 (0) | 2020.10.12 |
간단한 DateTime SQL 쿼리 (0) | 2020.10.12 |