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

κΈ°λ‘μΌκΈ°πŸ“«Β·2020λ…„ 12μ›” 21일
0

Javascript κ°œλ…μ •λ¦¬

λͺ©λ‘ 보기
8/15

μžλ°”μŠ€ν¬λ¦½νŠΈ 곡뢀λ₯Ό μ‹œμž‘ν•  λ•Œ λΆ€ν„°, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“ κ²ƒμ„ λ‹΄κ³  μžˆλ‹€κ³  ν•΄μ„œ 항상 무엇인지 κΆκΈˆν–ˆλ‹€. 이번 ν¬μŠ€νŒ…μ€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄ μ •λ¦¬ν•œλ‹€.

λ³Έ ν¬μŠ€νŒ…μ€ 이웅λͺ¨λ‹˜μ˜ λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ deep dive 19μž₯을 μ°Έμ‘°ν•˜μ—¬ μž‘μ„± ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


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


μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(Execution Context)λŠ” scope, hoisting, this, function, closure λ“±μ˜ λ™μž‘μ›λ¦¬λ₯Ό λ‹΄κ³  μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 핡심원리이닀.

ECMAScript μŠ€νŽ™μ— λ”°λ₯΄λ©΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯ΌΒ μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό ν˜•μƒν™”ν•˜κ³  κ΅¬λΆ„ν•˜λŠ” 좔상적인 κ°œλ…μ΄λΌκ³  μ •μ˜ν•œλ‹€. μ’€ 더 μ‰½κ²Œ λ§ν•˜μžλ©΄Β μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μœ„ν•΄ ν•„μš”ν•œ ν™˜κ²½μ΄λ‹€.


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

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

  • μ „μ—­ μ½”λ“œ : μ „μ—­ μ˜μ—­μ— μ‘΄μž¬ν•˜λŠ” μ½”λ“œ
  • ν•¨μˆ˜ μ½”λ“œ : ν•¨μˆ˜ 내에 μ‘΄μž¬ν•˜λŠ” μ½”λ“œ
  • Eval μ½”λ“œ :Β eval ν•¨μˆ˜λ‘œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
  • λͺ¨λ“ˆ μ½”λ“œ : λͺ¨λ“ˆ 내뢀에 μ‘΄μž¬ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ

이 ν¬μŠ€νŒ…μ—μ„œλŠ” μ „μ—­μ½”λ“œμ™€ ν•¨μˆ˜ μ½”λ“œμ— λŒ€ν•΄μ„œλ§Œ μ‚΄νŽ΄λ³Έλ‹€.

μ „μ—­μ½”λ“œ

μ „μ—­ μ½”λ“œλŠ” μ „μ—­ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ΅œμƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„λ₯Ό 생성해야 ν•œλ‹€. 그리고 var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λ₯Ό μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ‘œ λ°”μΈλ”©ν•˜κ³  μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ μ „μ—­ 객체와 μ—°κ²°λ˜μ–΄μ•Ό ν•œλ‹€.

μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜λ©΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λœλ‹€.


ν•¨μˆ˜ μ½”λ“œ

ν•¨μˆ˜ μ½”λ“œλŠ” 지역 μŠ€μ½”λ“œλ₯Ό μƒμ„±ν•˜κ³  지역 λ³€μˆ˜, λ§€κ°œλ³€μˆ˜ ,arguments 객체λ₯Ό 관리해야 ν•œλ‹€. 그리고 μƒμ„±ν•œ 지역 μŠ€μ½”ν”„λ₯Ό μ „μ—­ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜λŠ” μŠ€μ½”ν”„ 체인의 μΌμ›μœΌλ‘œ μ—°κ²°ν•΄μ•Ό ν•œλ‹€.

ν•¨μˆ˜ μ½”λ“œκ°€ ν‰κ°€λ˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λœλ‹€.



λͺ¨λ“  μ†ŒμŠ€μ½”λ“œλŠ” 싀행에 μ•žμ„œ 평가 과정을 거치며 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. ν‰κ°€λž€ μ‰½κ²Œ λ§ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹€ν–‰ 전에 μŠ₯~ ν›‘μœΌλ©° μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μž‘μ—…μ„ μ§„ν–‰ν•˜λŠ” 것을 λ§ν•œλ‹€.

λͺ¨λ“  μ½”λ“œλŠ” "평가" β†’ "μ‹€ν–‰"의 μˆœμ„œλ‘œ 이어진닀!!


λ‹€μŒ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

μœ„ μ½”λ“œμ˜ 싀행은 λ‹€μŒκ³Ό 같은 과정을 거쳐 이루어진닀.


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

    μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œλŠ” μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰ν•œλ‹€(undefined둜 μ΄ˆκΈ°ν™”). var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜λœ μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ λœλ‹€.


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

    μ „μ—­ μ½”λ“œ 평가 과정이 λλ‚˜λ©΄ λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ μ „μ—­ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€. μ΄λ•Œ μ „μ—­ λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜κ³  ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€. ν•¨μˆ˜κ°€ 호좜되면 순차적으둜 μ‹€ν–‰λ˜λ˜ μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³  μ½”λ“œ μ‹€ν–‰μˆœμ„œλ₯Ό λ³€κ²½ν•˜μ—¬ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž…ν•œλ‹€.

    즉 , foo(100)을 λ§Œλ‚˜λ©΄ μ „μ—­μ½”λ“œ 싀행을 λ©ˆμΆ”κ³  foo ν•¨μˆ˜λ₯Ό ν‰κ°€ν•˜κΈ° μ‹œμž‘ν•œλ‹€.


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

    λ§ˆμ°¬κ°€μ§€λ‘œ ν•¨μˆ˜ 블둝 λ‚΄λΆ€μ—μ„œ λ§€κ°œλ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜λ₯Ό λ¨Όμ € 선언문을 μ‹€ν–‰ν•˜κ³ , λ³€μˆ˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” 지역 μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€. λ˜ν•œ argument 객체λ₯Ό μƒμ„±ν•˜κ³  this 바인딩을 κ²°μ •ν•œλ‹€.


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

    ν•¨μˆ˜ μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜κΈ° μ‹œμž‘ν•œλ‹€. μ΄λ•Œ console.logλ₯Ό λ§Œλ‚˜λ©΄ μ‹λ³„μžμΈ console을 μŠ€μ½”ν”„ 체인을 톡해 κ²€μƒ‰ν•œλ‹€. 이λ₯Ό μœ„ν•΄ ν•¨μˆ˜ μ½”λ“œμ˜ 지역 μŠ€μ½”ν”„λŠ” μƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„μ™€ μ—°κ²°λ˜μ–΄μ•Ό ν•œλ‹€.(console은 global ν•¨μˆ˜μ˜ propertyμž„)


πŸ’‘ μ—¬κΈ°μ„œ μš°λ¦¬λŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ˜ 원리에 λŒ€ν•΄μ„œ μ•Œ 수 μžˆλ‹€. μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „ ν‰κ°€λ˜λŠ” κ³Όμ •μ—μ„œ λ³€μˆ˜λŠ” 이미 μƒμ„±λ˜λŠ” 것이닀!


μœ„ μ½”λ“œμ˜ μ‹€ν–‰ 과정을 보며 μ•Œ 수 있 듯이, μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” μŠ€μ½”ν”„, μ‹λ³„μž, μ½”λ“œ μ‹€ν–‰ μˆœμ„œλ“±μ˜ 관리가 ν•„μš”ν•˜λ‹€.

이 λͺ¨λ“ κ²ƒμ„ κ΄€λ¦¬ν•˜λŠ” 것이 λ°”λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀)λ₯Ό λ“±λ‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μŠ€μ½”ν”„μ™€ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό κ΅¬ν˜„ν•œ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ‹€ν–‰λ˜κ³  κ΄€λ¦¬λœλ‹€.



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

κ·Έλ ‡λ‹€λ©΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ–΄λ–»κ²Œ 이루어져 있고 μ–Έμ œ μƒμ„±λ˜λŠ” κ²ƒμΌκΉŒ?

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 크게 두가지 μš”μ†Œλ‘œ 정리할 수 μžˆλ‹€.

  1. μ½”λ“œ μ‹€ν–‰ μˆœμ„œλ₯Ό κ΄€λ¦¬ν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ
  2. μ‹λ³„μžμ™€ μŠ€μ½”ν”„λ₯Ό κ΄€λ¦¬ν•˜λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½


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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ€ 말 κ·ΈλŒ€λ‘œ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό κ΄€λ¦¬ν•˜λŠ” μŠ€νƒ(stack)이닀.

μœ„ μ½”λ“œλ₯Ό 보자. μ•žμ„œ λ§ν–ˆλ“―, λͺ¨λ“  μ½”λ“œλŠ” 평가λ₯Ό 거쳐 μ‹€ν–‰λœλ‹€. λ”°λΌμ„œ μœ„ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 단계λ₯Ό 거쳐 μ‹€ν–‰λœλ‹€.

μ „μ—­ μ½”λ“œμ˜ 평가와 μ‹€ν–‰ β†’ foo ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰ β†’ bar ν•¨μˆ˜ μ½”λ“œμ˜ 평가와 μ‹€ν–‰ β†’ foo ν•¨μˆ˜ μ½”λ“œλ‘œ 볡귀 β†’ μ „μ—­ μ½”λ“œλ‘œ 볡귀

각 κ³Όμ •μ—μ„œ μ‹€ν–‰μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ 보면 λ‹€μŒκ³Ό κ°™λ‹€.

ν•¨μˆ˜κ°€ 호좜될 λ•Œ λ§ˆλ‹€, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν•˜λ‚˜μ”© μƒμ„±λ˜μ–΄ μŠ€νƒμ— μŒ“μΈλ‹€.

즉, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ–Έμ œλ‚˜ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ΄κ³ , 각각의 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 가진닀.

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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ˜ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό κ΄€λ¦¬ν•œλ‹€λ©΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μŠ€μ½”ν”„μ™€ μ‹λ³„μžλ₯Ό κ΄€λ¦¬ν•œλ‹€.

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ λ‹€μŒκ³Ό 같은 λ‘κ°œμ˜ μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœλ‹€.

  1. EnvironmentRecord(ν™˜κ²½λ ˆμ½”λ“œ)

    μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  λ“±λ‘λœ μ‹λ³„μžμ— λ°”μΈλ”˜λ­ 값을 κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œμ΄λ‹€. μ‰½κ²Œ λ§ν•˜λ©΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ 각 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ§ˆλ‹€ μ‘΄μž¬ν•˜λ©° κ·Έ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜μ™€ this등을 κ΄€λ¦¬ν•œλ‹€.

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

    μƒμœ„ μŠ€μ½”ν”„ μ°Έμ‘°λ₯Ό μœ„ν•΄ μžˆλŠ” μ»΄ν¬λ„ŒνŠΈμ΄λ‹€. 이λ₯Ό ν†΅ν•΄μ„œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•  수 있기 λ•Œλ¬Έμ— μŠ€μ½”ν”„ 체인이 ν˜•μ„±λ˜κ³ , μ‹λ³„μžλ₯Ό 검색 κ°€λŠ₯ν•˜λ‹€!


λ‚΄μš©μ΄ κΈΈμ—ˆλŠ”λ°, λ§ˆμ§€λ§‰μœΌλ‘œ μ •λ¦¬ν•΄λ³΄μž.

ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μƒˆλ‘œμš΄ μŠ€νƒμ΄ μŒ“μ΄κ³ , 각각의 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 가지고 μžˆλ‹€.
λ ‰μ‹œμ»¬ ν™˜κ²½μ€ κ·Έ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ³€μˆ˜μ— λŒ€ν•œ 정보와 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ 정보, this 바인딩 정보λ₯Ό 가지고 μžˆλ‹€.



μžλ°”μŠ€ν¬λ¦½νŠΈ deep dive πŸ‘

이 책은 말 κ·ΈλŒ€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 맀λ ₯에 깊게 λΉ μ§€κ²Œ ν•΄μ£ΌλŠ” 책인 것 κ°™λ‹€. 처음 μ½μ—ˆμ„λ•Œ 잘 이해가 μ•ˆλ˜μ–΄μ„œ, μ§‘μ€‘ν•΄μ„œ μ„Έλ²ˆ 정도 μ½μ—ˆλ”λ‹ˆ μ•žμ—μ„œ κ³΅λΆ€ν–ˆλ˜ λ³€μˆ˜ hoisting, scope chain이 μ™œ λ°œμƒν•˜λŠ”μ§€ 이해할 수 μžˆμ—ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 깊게 κ³΅λΆ€ν•˜κ³  싢은 뢄이 μžˆλ‹€λ©΄ κΌ­ μ½λŠ”κ²ƒμ„ μΆ”μ²œλ“œλ¦°λ‹€.

0개의 λŒ“κΈ€