πŸͺ΄ μ„±μž₯일지

μ±… ν–‰λ³΅ν•œ 이기주의자(웨인 닀이어)의 λ‚΄μš©μ— μžκ·Ήλ°›μ•„ μ‹œμž‘ν•˜λŠ” μ†Œλ°•ν•œ μ„±μž₯기둝

μ‚΄μ•„μžˆλŠ” 꽃과 죽은 꽃은 μ–΄λ–»κ²Œ κ΅¬λ³„ν•˜λŠ”κ°€?
μ„±μž₯ν•˜κ³  μžˆλŠ” 것이 μ‚΄μ•„ μžˆλŠ” 것이닀.
생λͺ…μ˜ μœ μΌν•œ μ¦κ±°λŠ” μ„±μž₯이닀!

🌳 ν‚€μ›Œλ“œ μ΅œλŒ€ν•œ κ°„λ‹¨ν•˜κ²Œ 정리, 좔후에 λ³΄λ©΄μ„œ 슀슀둜 μ„€λͺ…

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

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 컴파일 μ–Έμ–΄μ˜ μž₯점을 μ·¨ν•œ 인터프리터 언어이닀.
μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” 평가(컴파일) 단계와 μ‹€ν–‰(인터프리터) λ‹¨κ³„λ‘œ λ‚˜λˆ„μ–΄μ ΈμžˆλŠ”λ°, 평가 단계 ν›„ μ½”λ“œ 싀행을 μœ„ν•œ ν™˜κ²½ 정보λ₯Ό λͺ¨μ•„놓은 객체λ₯Ό ν˜•μ„±ν•œλ‹€.
즉, μ½”λ“œ 싀행을 μœ„ν•œ ν™˜κ²½ 정보λ₯Ό λͺ¨μ•„놓은 객체가 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ΄λ‹€.

기본적으둜 μ „μ—­ μ½”λ“œμ— λŒ€ν•œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³ , ν•¨μˆ˜μ˜ 호좜 μ‹œ ν•¨μˆ˜μ˜ μ„ μ–ΈλΆ€λ₯Ό κΈ°μ€€μœΌλ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.

μ½œμŠ€νƒ(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ)

μŠ€νƒ 자료ꡬ쑰 ν˜•νƒœλ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ €μž₯λ˜λŠ” ꡬ쑰이닀. μ΅œμƒλ‹¨μ— μœ„μΉ˜ν•œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλΆ€ν„° μ²˜λ¦¬ν•˜λ©° μ½œμŠ€νƒμ„ λΉ„μ›Œλ‚˜κ°„λ‹€.
즉, μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό κ΄€λ¦¬ν•œλ‹€.

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

ν˜„μž¬ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ„ μ–Έλœ μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름)λ₯Ό λ“±λ‘ν•œλ‹€.
즉, μ‹λ³„μžμ™€ μŠ€μ½”ν”„λ₯Ό κ΄€λ¦¬ν•œλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ ꡬ쑰

  • VariableEnvironment: LexicalEnvironment와 같은 ꡬ쑰둜 μ΄ˆκΈ°κ°’μ„ snapshot ν˜•μ‹μœΌλ‘œ κ°–κ³  μžˆλ‹€.
  • LexicalEnvironment(μ€‘μš”)
    • EnvironmentRecord: ν˜„μž¬ μŠ€μ½”ν”„μ— λŒ€ν•œ μ‹λ³„μž 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 객체(ν˜Έμ΄μŠ€νŒ…κ΄€λ ¨)
      • Object Envioronment Record: var, ν•¨μˆ˜ 선언문에 μ˜ν•œ λ³€μˆ˜μ— λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 객체
      • Declarative Environment Record: let, const에 μ˜ν•œ λ³€μˆ˜ 및 ν•¨μˆ˜μ— λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” 객체
    • OuterEnvironmentReference: ν•¨μˆ˜κ°€ μ •μ˜λ˜κΈ° 직전 μŠ€μ½”ν”„(μ™ΈλΆ€ μŠ€μ½”ν”„)에 λŒ€ν•œ LexicalRecordλ₯Ό μ°Έμ‘°ν•˜λŠ” 객체(μŠ€μ½”ν”„ 체인관련)
    • ThisBinding: 객체 λ‚΄λΆ€μ—μ„œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” thisλ₯Ό bindingν•˜λŠ” 객체

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성 -> λ ‰μ‹œμ»¬ ν™˜κ²½ 생성 -> ν™˜κ²½ λ ˆμ½”λ“œ 생성(객체 ν™˜κ²½ -> 선언적 ν™˜κ²½) -> this 바인딩 -> μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ°Έμ‘° κ²°μ •

블둝 레벨 μŠ€μ½”ν”„μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½

ifλ¬Έκ³Ό 같은 블둝이 ν˜•μ„±λ˜μ—ˆμ„ λ•Œ, ν•΄λ‹Ή μ½”λ“œ 블둝을 μœ„ν•œ μƒˆλ‘œμš΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μƒμ„±λ˜λ©° 기쑴의 λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό κ΅μ²΄ν•œλ‹€.
varλŠ” ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„, let/constλŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€.

λ°˜λ“œμ‹œ κΈ°μ–΅ν•  것

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ 생성은 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œμ΄λ‹€. ν•˜μ§€λ§Œ κ·Έ ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ OuterEnvironmentReferenceλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•œ μ‹œμ μ„ κΈ°μ€€μœΌλ‘œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€λŠ” 점은 κΌ­ κΈ°μ–΅ν•˜μž!

JavaScript ν΄λ‘œμ €

ν΄λ‘œμ €λž€ μ–΄λ–€ μ™ΈλΆ€ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” λ‚΄λΆ€ν•¨μˆ˜(μ€‘μ²©ν•¨μˆ˜)κ°€ μ™ΈλΆ€λ‘œ μ „λ‹¬λ˜μ–΄ 싀행될 수 μžˆμ„ λ•Œ μΌμ–΄λ‚˜λŠ” ν˜„μƒμ΄λ‹€.
μ™ΈλΆ€ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 이미 μ’…λ£Œκ°€ λ˜μ—ˆμŒμ—λ„ μ™ΈλΆ€λ‘œ μ „λ‹¬λ˜ λ‚΄λΆ€ν•¨μˆ˜κ°€ 호좜 κ°€λŠ₯ν•˜κΈ°μ— μ™ΈλΆ€ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ GC(가비지 μ½œλ ‰ν„°)에 μ˜ν•΄ λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°λ˜μ§€ μ•Šκ²Œ λœλ‹€. 이와 같은 ν˜„μƒμ΄ 곧 ν΄λ‘œμ €μ΄λ©° 이런 ν΄λ‘œμ € ν˜„μƒμ„ μ΄μš©ν•˜μ—¬ μ½œλ°±ν•¨μˆ˜μ—μ„œ μ™ΈλΆ€ 데이터 μ°Έμ‘°, 정보 은닉, λΆ€λΆ„μ μš©ν•¨μˆ˜, μ»€λ§ν•¨μˆ˜ λ“±μœΌλ‘œ μ΄μš©ν•  수 μžˆλ‹€.

ν΄λ‘œμ € ν˜„μƒ μ‹œ κ°œλ…μ μœΌλ‘  μ™ΈλΆ€ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½ μ „λΆ€κ°€ λ©”λͺ¨λ¦¬μ—μ„œ μ§€μ›Œμ§€λ©΄ μ•ˆλ˜μ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—μ„œλŠ” κ·Έ λ ‰μ‹œμ»¬ ν™˜κ²½ λ‚΄μ—μ„œ μ‹€μ œ λ‚΄λΆ€ν•¨μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜μ— λŒ€ν•΄μ„œλ§Œ μ œκ±°λ˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„λ˜μ–΄μžˆλ‹€.