JS: try { return } VS finally { return }
4704 단어 JavaScripttech
try
의return' 과 'finally
의return' 이 일련의 실행 경로에 존재할 때'finally 의return '이 우선됩니다.'그렇게 되겠지'알면서도 스타일이 어떻게 될지 신경 쓰여서 ECMAScript 설명서를 읽었는데 제가 설명해 드릴게요!
try 사양
try 문장의 규격은 여기에 쓰여 있다
Syntax의 항목을 보면try문장은 대체적으로 다음과 같은 문법을 정의합니다. (최근catch의 매개 변수는 임의입니다)
try { } catch (identifier) { }
try { } finally (identifier) { }
try { } catch (e) finally (identifier) { }
이거 다들 아시죠.그럼 실제 동작을 정의하는 Semantics 항목을 읽어봅시다.
그 중에서try
TryStatement : try Block Catch Finally
에서finally의 행위를 정의했다.대충 번역한 말
B.[[Type]]
가throw
라면B.[[Value]]
catch절에 맡기고 그 결과를 C만약
B.[[Type]]
throwB(tryの結果)
=C(catchの結果)
F.[[Type]]
노멀F(finallyの結果)
=C(Catchの結果)
그런 것 같아요.
즉, 만약try와finally가 모두 되돌아온다면
4.
에서finally내의 귀환을 평가한다5.
에서F.[[Type]]
normal(반환)이 아니기 때문에F.[[Value]]
귀환Update Empty, Commpletion 등 잘 모르는 단어가 생겨서 다음에 여기서 찾아보세요!
UpdateEmpty(completionRecord, value)
파, Update Empty는 "Commpletion 생성"같은 것이다.
정확히 말하면'compuletionRecord가 정확한 상태라고 판단하고 Compuletion을 생성하는 역할'이다.
더 이상의 정의가 없기 때문에 Update Empty의 해설은 여기서 끝입니다!!!!!!!
Completion
그래서 보아하니
Completion
가 여기 이야기의 본질인 것 같다.상세한 내용은 이해할 수 없지만 Compuletion은'자바스크립트 엔진 내부의 데이터 제어용 유형','블록의 끝 상태를 나타내는 유형'(함수의 끝 상태도 나타낼 수 있음)
구체적으로 말하면 다음과 같은 구조가 있다
type Completion = {
[[Type]]: 'normal' | 'break' | 'continue' | 'return' | 'throw'
[[Value]]: any
[[Target]]: string | empty
}
Completion.[[Type]]
는 이 절차가 어떻게 끝나는지 나타낸다."finally 내의 반환"으로 끝나면
.[[Type]]
return
일 수 있습니다.그리고 프로그래머가 처리를 명확하게 끝내지 않았다면 아마 normal
일 거예요.따라서finally를 실행한 후의 흐름
4.
~6.
의 규범에서finally의 반환이 우선된다.4. finallyを実行し、その結果をFとする
- `F.[[Type]]`は return になる
5. `F.[[Type]]`がnormalなら`F(finallyの結果)` = `C(Catchの結果)`とする
- `F.[[Type]]`は normal ではない(return)
- → Fはfinallyの結果のままになる
6. Completion(UpdateEmpty(F, undefined))を返す
- → Finallyの完了状態が返される
그런 것 같아요.
Reference
이 문제에 관하여(JS: try { return } VS finally { return }), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hanak1a/articles/7b0942555da9a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)