JS: try { return } VS finally { return }

4704 단어 JavaScripttech
자바스크립트에서 'try 의return' 과 'finally 의return' 이 일련의 실행 경로에 존재할 때'finally 의return '이 우선됩니다.
'그렇게 되겠지'알면서도 스타일이 어떻게 될지 신경 쓰여서 ECMAScript 설명서를 읽었는데 제가 설명해 드릴게요!

try 사양


try 문장의 규격은 여기에 쓰여 있다
https://262.ecma-international.org/#sec-try-statement
Syntax의 항목을 보면try문장은 대체적으로 다음과 같은 문법을 정의합니다. (최근catch의 매개 변수는 임의입니다)
try { } catch (identifier) { }
try { } finally (identifier) { }
try { } catch (e) finally (identifier) { }
이거 다들 아시죠.
그럼 실제 동작을 정의하는 Semantics 항목을 읽어봅시다.
https://262.ecma-international.org/#sec-try-statement-runtime-semantics-evaluation
그 중에서tryTryStatement : try Block Catch Finally에서finally의 행위를 정의했다.

대충 번역한 말
  • try 블록을 실행하고 결과를 B
  • 로 설정합니다.
  • B.[[Type]]throw라면B.[[Value]]catch절에 맡기고 그 결과를 C
  • 로 설정합니다.

  • 만약B.[[Type]]throwB(tryの結果)=C(catchの結果)
  • finally를 실행하고 결과를 F
  • 로 설정합니다.
  • F.[[Type]]노멀F(finallyの結果)=C(Catchの結果)
  • Compuletion(Updatempty(F,undefined))
  • 반환
    그런 것 같아요.
    즉, 만약try와finally가 모두 되돌아온다면
  • 4.에서finally내의 귀환을 평가한다
  • 5.에서F.[[Type]]normal(반환)이 아니기 때문에F.[[Value]]귀환
  • 그렇지!
    Update Empty, Commpletion 등 잘 모르는 단어가 생겨서 다음에 여기서 찾아보세요!

    UpdateEmpty(completionRecord, value)


    파, Update Empty는 "Commpletion 생성"같은 것이다.
    정확히 말하면'compuletionRecord가 정확한 상태라고 판단하고 Compuletion을 생성하는 역할'이다.
    더 이상의 정의가 없기 때문에 Update Empty의 해설은 여기서 끝입니다!!!!!!!
    https://262.ecma-international.org/#sec-updateempty

    Completion


    그래서 보아하니Completion가 여기 이야기의 본질인 것 같다.
    https://262.ecma-international.org/#sec-completion-record-specification-type
    상세한 내용은 이해할 수 없지만 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の完了状態が返される
    
    그런 것 같아요.

    좋은 웹페이지 즐겨찾기