λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[4μ£Όμ°¨ μŠ€ν„°λ””] 23μž₯-μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

by HomieKim 2022. 2. 23.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ°”λ₯΄κ²Œ 이해 ν•œλ‹€λ©΄ μ•Œ 수 μžˆλŠ” 것듀

  1. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μŠ€μ½”ν”„ 기반 μ‹λ³„μžμ™€ μ‹λ³„μž 바인딩을 κ΄€λ¦¬ν•˜λŠ” 방식
  2. ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 이유
  3. ν΄λ‘œμ €μ˜ λ™μž‘ 방식
  4. νƒœμŠ€ν¬ 큐와 ν•¨κ»˜ λ™μž‘ν•˜λŠ” 이벀트 ν•Έλ“€λŸ¬
  5. 비동기 처리의 λ™μž‘ 방식

μ†ŒμŠ€μ½”λ“œμ˜ νƒ€μž…

  • ECMAScript 사양은 μ†ŒμŠ€μ½”λ“œλ₯Ό 4가지 νƒ€μž…μœΌλ‘œ ꡬ뢄, μ΄λ•Œ μ†ŒμŠ€ν¬λ„λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 생성
μ „μ—­ μ½”λ“œ(global code) 전역에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ. 전역에 μ •μ˜λœ ν•¨μˆ˜, 클래슀 λ“±μ˜ λ‚΄λΆ€ μ½”λ“œλŠ” 포함 X
ν•¨μˆ˜ μ½”λ“œ(function code) ν•¨μˆ˜ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ ν•¨μˆ˜ 내뢀에 μ€‘μ²©λœ ν•¨μˆ˜, 클래슀 λ“±μ˜ λ‚΄λΆ€ μ½”λ“œλŠ” 포함 X
eval μ½”λ“œ(eval code) 빌트인 μ „μ—­ ν•¨μˆ˜μΈ eval ν•¨μˆ˜μ— 인수둜 μ „λ‹¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” μ†ŒμŠ€μ½”λ“œ.
λͺ¨λ“ˆ μ½”λ“œ(module code) λͺ¨λ“ˆ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ. λͺ¨λ“ˆ λ‚΄λΆ€ ν•¨μˆ˜, 클래슀 λ“±μ˜ λ‚΄λΆ€ μ½”λ“œλŠ” 포함 X

μ†ŒμŠ€μ½”λ“œλŠ” νƒ€μž…μ— 따라 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” κ³Όμ •κ³Ό 관리 λ‚΄μš©μ΄ λ‹€λ₯΄λ‹€

  1. μ „μ—­ μ½”λ“œ
  • μ „μ—­ λ³€μˆ˜ 관리λ₯Ό μœ„ν•΄ μ΅œμƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„ 생성
  • var둜 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έ 문으둜 μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λ₯Ό μ „μ—­ 객체에 바인딩
  1. ν•¨μˆ˜ μ½”λ“œ
  • ν•¨μˆ˜ μ½”λ“œλŠ” 지역 μŠ€μ½”ν”„λ₯Ό 생성
  • μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, argument객체 κ΄€λ¦°
  • μƒμ„±ν•œ 지역 μŠ€μ½”ν”„λ₯Ό μ „μ—­ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜λŠ” μŠ€μ½”ν”„ 체인으둜 μ—°κ²°
  1. evalμ½”λ“œ
  • strict modeμ—μ„œ μžμ‹ λ§Œμ˜ λ…μžμ μΈ μŠ€μ½”ν”„λ₯Ό 생성
  1. λͺ¨λ“ˆ μ½”λ“œ
  • λͺ¨λ“ˆλ³„λ‘œ 독릭적인 λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό 생성

각 νƒ€μž…λ³„λ‘œ μ†ŒμŠ€μ½”λ“œκ°€ ν‰κ°λ˜λ©΄ 각각 λ‹€λ₯Έ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

μ†ŒμŠ€μ½”λ“œμ˜ 평가와 μ‹€ν–‰

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진 은 2개의 κ³Όμ •μœΌλ‘œ λ‚˜λˆ„μ–΄ 처리
  • μ†ŒμŠ€μ½”λ“œ 평가 와 μ†ŒμŠ€μ½”λ“œμ˜ μ‹€ν–‰ κ³Όμ •μœΌλ‘œ λ‚˜λˆ„μ–΄ 처리

    좜처 : https://publizm.github.io

μ†ŒμŠ€μ½”λ“œ 평가

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  λ³€μˆ˜, ν•¨μˆ˜ λ“±μ˜ μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰
  • μ„ μ–Έλ¬Έ μ‹€ν–‰ν•˜μ—¬ λ³€μˆ˜ λ‚˜ ν•¨μˆ˜ μ‹λ³„μžκ°€ 생성됨
  • μƒμ„±λœ μ‹λ³„μžλ₯Ό ν‚€λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ— 등둝

    μ‹€ν–‰μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„λ₯Ό λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ ν™˜κ²½λ ˆμ½”λ“œ 라고 함

μ†ŒμŠ€μ½”λ“œ μ‹€ν–‰

  • 평가 κ³Όμ • λλ‚œ ν›„ μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰ (λŸ°νƒ€μž„)
  • μ΄λ•Œ μ†ŒμŠ€μ½”λ“œ 싀행에 ν•„μš”ν•œ 정보(λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ˜ μ°Έμ‘°)λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ—μ„œ κ²€μƒ‰ν•˜μ—¬ 취득
  • μ‹€ν–‰λœ κ²°κ³ΌλŠ” λ‹€μ‹œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 등둝

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μ—­ν• 

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ½”λ“œλ₯Ό ν‰κ°€ν•˜κ³  μ‹€ν–‰ ν•˜λŠ” κ³Όμ •

    1. μ „μ—­ μ½”λ“œ 평가

      μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€.

      var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

    2. μ „μ—­ μ½”λ“œ μ‹€ν–‰

      λŸ°νƒ€μž„μ—μ„œ μ „μ—­ λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜κ³  ν•¨μˆ˜κ°€ 호좜 λœλ‹€.

      ν•¨μˆ˜κ°€ 호좜 도면 μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³  ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…

    3. ν•¨μˆ˜ μ½”λ“œ 평가

      ν•¨μˆ˜ ν˜ΈμΆœμ— μ˜ν•΄ μ½”λ“œ 싀행이 ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…ν•˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ 이전에 평가 κ³Όμ • κ±°μΉ¨

      맀개 λ³€μˆ˜μ™€ 지역 λ³€μˆ˜ 선언문이 ν‰κ°€λ˜κ³  지역 μŠ€μ½”ν”„(ν•¨μˆ˜ μ‹€ν–‰μ»¨ν…μŠ€νŠΈ)에 λ“±λ‘λœλ‹€.

      ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 지역 λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλŠ” arguments 객체도 μƒμ„±λ˜μ–΄ 지역 μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€.

    4. ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰

      ν•¨μˆ˜ λ‚΄λΆ€μ˜ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰

      λ§€κ°œλ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜κ³  ν•¨μˆ˜ 내뢀에 λ©”μ„œλ“œκ°€ μžˆμ„ μ‹œ 호좜 됨( 이 λ©”μ„œλ“œ μ—­μ‹œ μŠ€μ½”ν”„ 체인 검색 및 μ½”λ“œ 평가, μ‹€ν–‰κ³Όμ • κ±°μΉ¨)
      ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰ κ³Όμ • μ’…λ£Œ ν›„ ν•¨μˆ˜ 호좜 μ΄μ „μœΌλ‘œ λŒμ•„κ°€ μ „μ—­ μ½”λ“œλ₯Ό μ‹€ν–‰

정리

  • μ½”λ“œκ°€ μ‹€ν–‰ 되렀면 μŠ€μ½”ν”„, μ‹λ³„μž, μ½”λ“œ μ‹€ν–‰ μˆœμ„œ λ“±μ˜ 관리가 ν•„μš” (이λ₯Ό κ΄€λ¦¬ν•˜λŠ” 것이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ)
  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ ν™˜κ²½μ„ 제곡, μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ‹€μ œλ‘œ κ΄€λ¦¬ν•˜λŠ” μ˜μ—­
  • μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ™€ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ©”μ»€λ‹ˆμ¦˜
  • μ‹λ³„μžμ™€ μŠ€μ½”ν”„λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ 관리
  • μ‹€ν–‰ μˆœμ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμœΌλ‘œ 관리

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ¨Όμ € μ „μ—­ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ μ „μ—­ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.

  • ν•¨μˆ˜κ°€ 호좜되면 ν•¨μˆ˜ μ½”λ“œλ₯Ό ν‰κ°€ν•˜μ—¬ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.

  • μ΄λ•Œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μŠ€νƒ(stack)자료ꡬ쑰둜 κ΄€λ¦¬λœλ‹€. 이λ₯Ό μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄λΌκ³  λΆ€λ₯Έλ‹€.

  • λ™μž‘κ³Όμ •

    1. μ „μ—­ μ½”λ“œμ˜ 평가와 μ‹€ν–‰
    2. ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰
    3. (μ€‘μ²©ν•¨μˆ˜ μžˆμ„ 경우) μ€‘μ²©ν•¨μˆ˜μ˜ 평가와 μ‹€ν–‰
    4. 쀑첩 ν•¨μˆ˜ μ’…λ₯˜ν›„ ν•¨μˆ˜μ½”λ“œλ‘œ 볡귀
    5. ν•¨μˆ˜ μ½”λ“œ μ’…λ£Œ ν›„ μ „μ—­ μ½”λ“œλ‘œ 볡귀
  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ€ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό 관리

  • μŠ€νƒμ˜ μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ–Έμ œλ‚˜ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

λ ‰μ‹œμ»¬ ν™˜κ²½

  • λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ‹λ³„μžμ™€ μ‹λ³„μžμ— λ°”μΈλ”©λœ κ°’, μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•˜λŠ” 자료ꡬ쑰
  • μŠ€μ½”ν”„μ™€ μ‹λ³„μžλ₯Ό 관리
  • 정리 : μŠ€μ½”ν”„λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œ μ—­ν• 

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ 두 개의 μ»΄ν¬λ„ŒνŠΈλ‘œ ꡬ성

  1. ν™˜κ²½ λ ˆμ½”λ“œ(Environment Record)
    • ν˜„μž¬ μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  값을 κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œ
  2. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°(Outer Lexical Environment Reference)
    • μƒμœ„ μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 말함, 쀑첩 ν•¨μˆ˜ λ– μ˜¬λ¦¬λ©΄ μ‰½κ²Œ 이해 κ°€λŠ₯, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ°Έμ‘°λ₯Ό 톡해 단방ν–₯ λ§ν¬λ“œ 리슀트인 μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ 생성과 μ‹λ³„μž 검색 κ³Όμ •

  • μ „μ—­μ½”λ“œ 평가 이전에 μ „μ—­ 객체가 λ¨Όμ € 생성 됨

μ „μ—­ μ½”λ“œ 평가 κ³Όμ •

  • 전체 λ™μž‘ μˆœμ„œ
    1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성
    2. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성
      2.1. μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성
      2.1.1. 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성
      2.1.2. 선언적 ν™˜κ²½ λ ˆμ½”λ“œ 생성
      2.2. this 바인딩
      2.3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •
  • μ „μ—­ μ½”λ“œ 평가 이후 μ „μ—­ μ½”λ“œ μ‹€ν–‰ ν•˜κ³  ν•¨μˆ˜ μ½”λ“œ 평가, μ‹€ν–‰

ν•˜λ‚˜ μ”© μ‚΄νŽ΄λ³΄λ©΄

1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

  • λΉ„μ–΄μžˆλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성

2. μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성

  • μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμ„±ν•˜κ³  μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 바인딩 함

  • λ ‰μ‹œμ»¬ ν™˜κ²½μ€ 2개의 μ»΄ν¬λ„ŒνŠΈλ‘œ ꡬ성(ν™˜κ²½ λ ˆμ½”λ“œ, μ™ΈλΆ€ λ ‰μ‹œμ»¬ μ°Έμ‘°)

    2.1. μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œ 생성

    • μ „μ—­ λ³€μˆ˜ 관리 ν•˜λŠ” μ „μ—­ μŠ€μ½”ν”„ , μ „μ—­ 빌트인 ν”„λ‘œνΌν‹°, ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체 제곡

    • 객체 ν™˜κ²½ λ ˆμ½”λ“œμ™€ 선언적 ν™˜κ²½ λ ˆμ½”λ“œλ‘œ ꡬ성

      2.1.1 객체 ν™˜κ²½ λ ˆμ½”λ“œ 생성

      • BindingObject 와 μ—°κ²° (μ „μ—­ 객체)

      • varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ λœλ‹€.

        2.1.2 선언적 ν™˜κ²½λ ˆμ½”λ“œ 생성

      • let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜(ν•¨μˆ˜ ν‘œν˜„μ‹ 포함)λŠ” 선언적 ν™˜κ²½ λ ˆμ½”λ“œμ— λ“±λ‘λ˜κ³  관리

      • μ—¬κΈ°μ„œ λŸ°νƒ€μž„μ— μ΄ˆκΈ°ν™” 되기 μ „κΉŒμ§€ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(TDZ: Temporal Dead Zone) 생김

      2.2. this 바인딩

    • μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[GlobalThisValue]] λ‚΄λΆ€ μŠ¬λ‘―μ— thisκ°€ 바인딩됨

    • μ „μ—° μ½”λ“œμ—μ„œ thisλŠ” μ „μ—­ 객체λ₯Ό 가리킴

      • this 바인딩은 μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œμ™€ ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œμ— 쑴재

      2.3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

    • ν˜„μž¬ 평가 쀑인 μ†ŒμŠ€μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ μ†ŒμŠ€ν¬λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀.

    • 이λ₯Ό 톡해 μŠ€μ½”ν”„ 체인 κ΅¬ν˜„

    • μ „μ—­ μ½”λ“œλŠ” μ΅œμƒμœ„ μ΄λ―€λ‘œ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” null

3. μ „μ—­ μ½”λ“œ μ‹€ν–‰

  • λ³€μˆ˜ ν• λ‹Ή 문이 μ‹€ν–‰λ˜μ–΄ 값이 ν• λ‹Ή, ν•¨μˆ˜λ₯Ό 호좜
  • μ΄λ•Œ λ³€μˆ˜ λ‚˜ ν•¨μˆ˜μ˜ μ‹λ³„μžκ°€ μ„ μ–Έλœ μ‹λ³„μžμΈμ§€ ν™•μΈν•˜λŠ” κ³Όμ •
  • μŠ€μ½”ν”„μ— 따라 λ™μΌν•œ μ‹λ³„μž μ‘΄μž¬ν•  수 λ„μžˆλ‹€.
  • 즉, μ–΄λŠ μŠ€μ½”ν”„μ˜ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•  지, μ„ μ–Έλœ μ‹λ³„μžμΈμ§€ μ‹λ³„μž κ²°μ • 이 ν•„μš”
  • μ‹λ³„μž 결정을 μœ„ν•΄ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹λ³„μž 검색 μ‹œμž‘
  • μ„ μ–Έλœ μ‹λ³„μžλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ ν™˜κ²½ λ ˆμ½”λ“œμ— 등둝 λ˜μ–΄ μžˆλ‹€.
  • ν˜„μž¬ μ‹€ν–‰μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹λ³„μžλ₯Ό 찾을 수 μ—†λ‹€λ©΄ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°κ°€ κ°€λ¦¬ν‚€λŠ” μƒμœ„ μŠ€μ½”ν”„λ‘œ μ΄λ™ν•˜μ—¬ 검색 (μŠ€μ½”ν”„ 체인 λ™μž‘ 원리)

ν•¨μˆ˜ μ½”λ“œ 평가 κ³Όμ •

  • 전체 λ™μž‘ μˆœμ„œ
    1. ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성
    2. ν•¨μˆ˜ λ ‰μ‹œμ»¨ ν™˜κ²½ 생성
      • 2.1. ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성
      • 2.2. this 바인딩
      2.3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •
  • μ „μ—­ μ½”λ“œ μ‹€ν–‰ ν•˜λ©΄μ„œ ν•¨μˆ˜ 호좜 문을 λ§Œλ‚˜λ©΄ μ „μ—­ μ½”λ“œμ˜ 싀행을 μ€‘λ‹¨ν•˜κ³  ν•¨μˆ˜ λ‚΄λΆ€ 이동

ν•˜λ‚˜μ”© μ‚΄νŽ΄λ³΄μž

1. ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

  • ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 생성 ν›„ ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μ™„μƒλ˜λ©΄ μŠ€νƒμ— ν‘Έμ‹œλ¨

2. ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ 생성

  • ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λ˜κ³  ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλž‘ 바인딩 됨

  • ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ μ—­μ‹œ ν™˜κ²½ λ ˆμ½”λ“œ 와 μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰둜 ꡬ성

    2.1. ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œ 생성

    • λ§€κ°œλ³€μˆ˜, arguments객체, ν•¨μˆ˜ λ‚΄λΆ€μ˜ λ³€μˆ˜μ™€ 쀑첩 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³  관리

    • μ΄λ•Œ λ§€κ°œλ³€μˆ˜λŠ” undefined둜 μ•”λ¬΅μ μœΌλ‘œ μ΄ˆκΈ°ν™” 됨

      this 바인딩

    • ν•¨μˆ˜ ν™˜κ²½ λ ˆμ½”λ“œμ˜ [[ ThisValue ]] λ‚΄λΆ€ μŠ¬λ‘―μ— thisκ°€ 바인딩 됨

    • μ΄λ•Œ thisλŠ” ν•¨μˆ˜ 호좜 방식에 따라 κ²°μ • 됨

      2.3. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ²°μ •

    • ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ” 지가 μ•„λ‹ˆλΌ 어디에 μ •μ˜ ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό 결정함

    • μžμ‹ μ΄ μ •μ˜λœ μŠ€μ½”ν”„, μ—μ„œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 κΈ°λ¦¬ν‚€κ²Œ ν•œλ‹€

    • μ „μ—­ ν•¨μˆ˜μ˜ 경우 λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μ™„μ„± 돼야 μŠ€νƒμ— ν‘Έμ‹œ 됨 -> 즉 μ „μ—­ ν•¨μˆ˜ 평가 μ‹œμ μ—μ„œ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

    • λ”°λΌμ„œ μ „μ—­ν•¨μˆ˜λŠ” μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ°Έμ‘°κ°€ ν• λ‹Ή

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ 블둝 레벨 μŠ€μ½”ν”„

  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λ§Œ λ”°λ₯Έλ‹€.
  • let, const둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” λͺ¨λ“  μ½”λ“œ 블둝을 지역 μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜λŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό λ”°λ₯Έλ‹€.
let x = 1;

if (true) {
  let x = 10;
  console.log(x); // 10
}

console.log(x); // 1
  • ifλ¬Έ λ‚΄μ—μ„œ letν‚€μ›Œλ“œλ‘œ λ³€μˆ˜ μ„ μ–Έ μ‹œ if문의 μ½”λ“œ 블둝을 μœ„ν•œ 블둝 레벨 μŠ€μ½”ν”„λ₯Ό 생성 ν•΄μ•Όν•œλ‹€.
  • 이런 경우 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒˆλ‘œ μƒμ„±λœ 블둝 레벨 μŠ€μ½”ν”„ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κ°€λ¦¬ν‚€κ²Œ λœλ‹€.
  • μƒμ„±λœ 블둝 레벨의 λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ 참쑰둜 기쑴의 μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 가리킨닀.
  • if문이 μ’…λ£Œλ˜λ©΄ μ΄μ „μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ 볡귀 ν•œλ‹€.

λŒ“κΈ€