[Javascript] Javascript Execution Context & Scope

@μ΅œν˜„μ›…(Harry) Β· April 09, 2024 Β· 25 min read

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

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œ ν•„μš”λ‘œ ν•˜λŠ” 정보(ν™˜κ²½)듀이 λ‹΄κ²¨μžˆλŠ” 객체이닀. μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ, νŠΉμ • ν™˜κ²½μ— μžˆλŠ” ν™˜κ²½ 정보듀을 λͺ¨μ€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ½œμŠ€νƒμ— μŒ“μ•„μ˜¬λ¦° ν›„ μ‹€ν–‰ν•œλ‹€.
μ—¬κΈ°μ„œ, νŠΉμ • ν™˜κ²½μ΄λž€ μ „μ—­ 곡간이 될 μˆ˜λ„ 있고 ν•¨μˆ˜ λ‚΄λΆ€μ˜ 곡간이 될 μˆ˜λ„ μžˆλ‹€. 이 λ•Œ, μŠ€μ½”ν”„, μ‹λ³„μž, μ½”λ“œ μ‹€ν–‰ μˆœμ„œλ“€μ˜ 관리가 ν•„μš”ν•œλ° 이 λͺ¨λ“  것을 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ ν•„μš”ν•˜λ‹€.

이번 κΈ€μ—μ„œλŠ” ν˜Έμ΄μŠ€νŒ…, μŠ€μ½”ν”„μ™€ ν•¨κ»˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μž‘ 원리λ₯Ό λ‹΄κ³  μžˆλŠ” 핡심 κ°œλ…μΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

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

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±ν•œ λͺ¨λ“  μ†ŒμŠ€ μ½”λ“œλŠ” 싀행에 μ•žμ„œ 평가 과정을 거치며, 평가λ₯Ό ν†΅ν•΄μ„œ 싀행을 μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό 평가와 μ‹€ν–‰ 두 가지 κ³Όμ •μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ²˜λ¦¬ν•œλ‹€.

평가 κ³Όμ •μ—μ„œλŠ”

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€.
  • λ³€μˆ˜, ν•¨μˆ˜ λ“±μ˜ μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰ν•˜μ—¬ μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 이름)λ₯Ό ν‚€λ‘œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ β†’ λ ‰μ‹œμ»¬ ν™˜κ²½ β†’ ν™˜κ²½ λ ˆμ½”λ“œμ— λ“±λ‘ν•œλ‹€.

평가 과정이 λλ‚˜λ©΄ λΉ„λ‘œμ†Œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜λ©°, 선언문을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•œλ‹€. 이 λ•Œ, 싀행에 ν•„μš”ν•œ 정보λ₯Ό 평가 κ³Όμ •μ—μ„œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 μ–»λŠ”λ‹€.

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

var harryAge = 26

const address = "busan"

function bar() {
  var harryAge = 20

  console.log("ν•΄λ¦¬μ˜ λ‚˜μ΄λŠ”", harryAge, "μž…λ‹ˆλ‹€.")

  function foo() {
    var nickName = "harry"

    console.log(nickName)
    console.log(harryAge)
    console.log(harryHobby) // Error!
  }

  foo()
}

bar()

console.log("ν•΄λ¦¬μ˜ λ‚˜μ΄λŠ”", harryAge, "μž…λ‹ˆλ‹€.")

μœ„ μ½”λ“œμ˜ μ‹€ν–‰λ˜λŠ” 과정을 κ°„λ‹¨ν•˜κ²Œ μ‚΄νŽ΄λ³΄λ©°, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ 역할에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

call stack

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

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ „, 평가 과정을 거치며 μ „μ—­ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. 이 λ•Œ, μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ½œμŠ€νƒμ— λ‹΄κΈ΄λ‹€. μ „μ—­ μ½”λ“œμ˜ λ³€μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ 선언문이 λ¨Όμ € μ‹€ν–‰λ˜κ³ , μƒμ„±λœ μ „μ—­ λ³€μˆ˜(harry)와 μ „μ—­ν•¨μˆ˜(bar)κ°€ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” μ „μ—­ μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€.
var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언문은 μ „μ—­ 객체(λΈŒλΌμš°μ €μ˜ 경우 window, Node.js의 경우 global)의 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œκ°€ λœλ‹€.

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

μ „μ—­ μ½”λ“œμ˜ 평가가 λλ‚œ ν›„, μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„μ΄ μ‹œμž‘λ˜μ–΄ μ „μ—­ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λœλ‹€. 이 λ•Œ, λ³€μˆ˜ 값을 ν• λ‹Ήν•˜κ±°λ‚˜, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ˜ 쀑, bar ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ–΄ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€.
ν•¨μˆ˜κ°€ 호좜되면 기쑴에 μ‹€ν–‰μ€‘μ΄λ˜ μ „μ—­ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•œλ‹€.

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

bar ν•¨μˆ˜ λ‚΄λΆ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ „ 평가 과정을 거치며 μ½”λ“œ 싀행을 μœ„ν•œ μ€€λΉ„λ₯Ό ν•œλ‹€. 즉, bar ν•¨μˆ˜μ˜ ν™˜κ²½ 정보듀을 μˆ˜μ§‘ν•΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  μ½œμŠ€νƒμ— λ‹΄λŠ”λ‹€. λ§€κ°œλ³€μˆ˜, 지역 λ³€μˆ˜μ˜ 선언문이 λ¨Όμ € μ‹€ν–‰λ˜κ³  ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” 지역 μŠ€μ½”ν”„μ— λ“±λ‘λœλ‹€.

  1. bar ν•¨μˆ˜ μ½”λ“œ μ‹€ν–‰, foo ν•¨μˆ˜ μ½”λ“œ 평가 및 μ‹€ν–‰

bar ν•¨μˆ˜ μ½”λ“œμ˜ 평가가 λλ‚œ ν›„, ν•¨μˆ˜ λ‚΄λΆ€ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λœλ‹€. bar ν•¨μˆ˜ λ‚΄λΆ€ μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜λ˜ 쀑, foo ν•¨μˆ˜κ°€ 호좜 λ˜μ—ˆλ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ, 기쑴에 μ‹€ν–‰μ€‘μ΄λ˜ bar ν•¨μˆ˜ λ‚΄λΆ€ μ½”λ“œμ˜ 싀행을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³ , foo ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μ „ 평가 과정을 거치며 μ½”λ“œ 싀행을 μœ„ν•΄ μ€€λΉ„ν•œλ‹€. foo ν•¨μˆ˜μ˜ ν™˜κ²½ 정보듀을 μˆ˜μ§‘ν•΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  μ½œμŠ€νƒμ— λ‹΄λŠ”λ‹€. 이 ν›„ μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λœλ‹€.

  1. μ‹€ν–‰ μ’…λ£Œ 및 μ½œμŠ€νƒμ—μ„œ 제거

foo ν•¨μˆ˜ μ½”λ“œ 싀행이 μ™„λ£Œλ˜λ©΄, μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€. 이 ν›„, bar ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ foo ν•¨μˆ˜ 호좜둜 인해 μΌμ‹œ μ€‘λ‹¨λ˜μ—ˆλ˜ 지점뢀터 λ‹€μ‹œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ³  μ™„λ£Œλ˜λ©΄ μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.

μ „μ—­ μ½”λ“œμ—μ„œλ„ bar ν•¨μˆ˜ 호좜둜 인해 μΌμ‹œ μ€‘λ‹¨λ˜μ—ˆλ˜ 지점뢀터 λ‹€μ‹œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ³  μ „μ—­μ—μ„œ μ‹€ν–‰ν•  μ½”λ“œκ°€ 더이상 λ‚¨μ•„μžˆμ§€ μ•Šλ‹€λ©΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ˜ν•œ μ½œμŠ€νƒμ—μ„œ μ œκ±°λ˜μ–΄ λͺ¨λ“  μ½”λ“œμ˜ 싀행이 μ’…λ£Œλœλ‹€.

μœ„ μˆœμ„œμ—μ„œ 확인할 수 μžˆλ“―, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ μŠ€μ½”ν”„, μ‹λ³„μž, μ‹€ν–‰ μˆœμ„œ λ“±μ˜ 관리가 ν•„μš”ν•˜λ©° 이 λͺ¨λ“  것을 κ΄€λ¦¬ν•˜λŠ” 것이 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ΄λ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹λ³„μž(λ³€μˆ˜, ν•¨μˆ˜, 클래슀 이름)을 κ΄€λ¦¬ν•˜κ³  μŠ€μ½”ν”„μ™€ μ½”λ“œ μ‹€ν–‰ μˆœμ„œ 관리λ₯Ό μœ„ν•΄ ν•„μš”ν•˜λ©° λͺ¨λ“  μ½”λ“œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 톡해 κ΄€λ¦¬λ˜κ³  μ‹€ν–‰λœλ‹€κ³  ν•  수 μžˆλ‹€.

μ‹λ³„μž, μŠ€μ½”ν”„λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ κ΄€λ¦¬ν•˜κ³  μ½”λ“œ μ‹€ν–‰ μˆœμ„œλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ(μ½œμŠ€νƒ)으둜 κ΄€λ¦¬ν•œλ‹€.

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

λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” ν•˜λ‚˜μ˜ λ‹¨μœ„μ΄λ©°, λ‹€μ‹œ ν™˜κ²½ λ ˆμ½”λ“œ, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰둜 κ΅¬λΆ„λœλ‹€.
λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν‚€, 값을 κ°–λŠ” 객체 ν˜•νƒœμ˜ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜μ—¬ μ‹λ³„μžλ₯Ό ν‚€λ‘œ λ“±λ‘ν•˜κ³  μ‹λ³„μžμ— 바인딩 된 값을 κ΄€λ¦¬ν•œλ‹€. 그리고 λ ‰μ‹œμ»¬ ν™˜κ²½μ— μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°λ‘ν•œλ‹€.

즉, λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μŠ€μ½”ν”„λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  관리할 수 μžˆλŠ” μ €μž₯μ†Œ 역할을 ν•œλ‹€.

이미지 크기가 λ„ˆλ¬΄ μ»€μ§€λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ λˆ•ν˜”λ‹€.
이미지 크기가 λ„ˆλ¬΄ μ»€μ§€λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ λˆ•ν˜”λ‹€.

  • ν™˜κ²½ λ ˆμ½”λ“œ

μŠ€μ½”ν”„μ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό λ“±λ‘ν•˜κ³  μ‹λ³„μžμ— 바인딩 된 값을 μ €μž₯ν•˜λŠ” μ €μž₯μ†Œμ΄λ‹€.

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

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ°€λ₯΄ν‚¨λ‹€. μƒμœ„ μŠ€μ½”ν”„λž€, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ§ν•˜λ©° 즉, ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œ μ†ŒμŠ€ μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ λ§ν•œλ‹€.

μ •λ¦¬ν•˜μžλ©΄, ν™˜κ²½ λ ˆμ½”λ“œμ™€ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° λ₯Ό ν†΅ν•΄μ„œ μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•˜κ³  관리할 수 μžˆλ‹€.

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μ—­ν•  λΆ€λΆ„μ˜ μ½”λ“œ μ˜ˆμ‹œλ₯Ό 톡해 쑰금 더 μ•Œμ•„λ³΄μž. 이 κΈ€μ—μ„œλŠ” μ „μ—­ μ½”λ“œμ˜ 평가 κ³Όμ •μ—μ„œ μƒμ„±λ˜λŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄μ„œ 닀뀄본닀.

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

global excution context

  • ν™˜κ²½ λ ˆμ½”μ˜ ꡬ성

var ν‚€μ›Œλ“œμ™€ ES6의 let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œ μ „μ—­ ν™˜κ²½ λ ˆμ½”λ“œλŠ” λ‹€μ‹œ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ™€ 선언적 ν™˜κ²½ λ ˆμ½”λ“œλ‘œ κ΅¬λΆ„λœλ‹€. 객체 ν™˜κ²½ λ ˆμ½”λ“œλŠ” 기쑴의 μ „μ—­ 객체가 κ΄€λ¦¬ν•˜λ˜ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜, ν‘œμ€€ 빌트인 객체(Number, Math,,,)λ₯Ό κ΄€λ¦¬ν•œλ‹€.

반면, 선언적 ν™˜κ²½ λ ˆμ½”λ“œλŠ” let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•œλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성될 λ•Œ κ΅¬μ„±λ˜λŠ” ν™˜κ²½ λ ˆμ½”λ“œλ₯Ό 톡해 νŠΉμ • μ½”λ“œ ν™˜κ²½μ˜ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•  수 μžˆλ‹€.

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

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

var harryAge = 26

function sayHi() {
  console.log("hi")
}

(μœ„μ™€ 같은 μ½”λ“œκ°€ μžˆμ„ λ•Œ, μ „μ—­ μ½”λ“œλŠ” sayHi ν•¨μˆ˜ μ½”λ“œλ₯Ό ν¬ν•¨ν•œλ‹€κ³  ν•  수 μžˆλ‹€.)

이λ₯Ό ν†΅ν•΄μ„œ 단방ν–₯ λ§ν¬λ“œ 리슀트인 μŠ€μ½”ν”„ 체인을 κ΅¬ν˜„ν•  수 μžˆλ‹€. ν˜„μž¬ 평가쀑인 μ†ŒμŠ€ μ½”λ“œλŠ” μ „μ—­ μ½”λ“œμ΄κ³ , μ „μ—­ μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ†ŒμŠ€ μ½”λ“œλŠ” μ—†μœΌλ―€λ‘œ μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰에 null이 ν• λ‹Ήλœλ‹€.

πŸ’­ ν˜Έμ΄μŠ€νŒ… μ•Œμ•„λ³΄κΈ°

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜λŠ” κ³Όμ •κ³Ό λ‚΄λΆ€ ꡬ성에 λŒ€ν•΄μ„œ κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³΄μ•˜λ‹€.
이제 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§• 쀑 ν•˜λ‚˜μΈ ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž. ν˜Έμ΄μŠ€νŒ…μ€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ κ°œλ…κ³Ό 관련이 μžˆλŠ” κ°œλ…μ΄λ‹€ :)

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

console.log(harryAge) // ?

var harryAge = 26
console.log(harryAge) // 26

μœ„ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž. harryAge λ³€μˆ˜(μ‹λ³„μž)에 26 μ΄λΌλŠ” 숫자 νƒ€μž…μ˜ λ³€μˆ˜ 값을 ν• λ‹Ήν–ˆλ‹€. ν• λ‹Ή 후에 μ½˜μ†”μ— harryAgeλ₯Ό 좜λ ₯해보면 26이 좜λ ₯될 것이닀.
κ·Έλ ‡λ‹€λ©΄, harryAge λ³€μˆ˜μ˜ μ„ μ–Έκ³Ό ν• λ‹Ή 전에 μ½˜μ†”μ— 좜λ ₯해보면 μ–΄λ–€ κ²°κ³Όκ°€ 좜λ ₯될까?

console.log(harryAge) // undefined

var harryAge = 26

μ„ μ–Έκ³Ό 할당을 ν•˜κΈ° μ „μ΄μ§€λ§Œ, μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  undefined κ°€ 좜λ ₯λœλ‹€. 이 ν˜„μƒμ„ ν˜Έμ΄μŠ€νŒ… 이라고 ν•˜λ©°, ν˜Έμ΄μŠ€νŒ…μ€ 선언문이 μ΅œμƒλ‹¨μ— λŒμ–΄μ˜¬λ €μ§„ λ“―ν•œ ν˜„μƒμ„ λ§ν•œλ‹€.
이 ν˜„μƒμ˜ μ΄μœ μ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄μž.

hoisting

평가 κ³Όμ •μ—μ„œλŠ” μ„ μ–Έλ¬Έλ§Œ λ¨Όμ € μ‹€ν–‰λ˜λ©°, 이 κ³Όμ •μ—μ„œ harryAgeλŠ” undefined둜 ν• λ‹Ήλ˜μ–΄ ν™˜κ²½ λ ˆμ½”λ“œμ— λ“±λ‘λœλ‹€. 더 μ΄μƒμ˜ 선언문이 μ—†μœΌλ―€λ‘œ 평가 과정이 μ’…λ£Œλ˜λ©°, μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€. 첫 번째 console.log λ₯Ό μ‹€ν–‰ν•  λ•Œ, ν™˜κ²½ λ ˆμ½”λ“œ 내뢀에 harryAgeκ°€ undefined 값을 가지고 μžˆμœΌλ―€λ‘œ undefinedλ₯Ό 좜λ ₯ν•œλ‹€.

이 ν›„, harryAge λ³€μˆ˜ 값이 26으둜 μž¬ν• λ‹Ήλœλ‹€.

두 번째 console.log λ₯Ό μ‹€ν–‰ν•  λ•Œ, ν™˜κ²½ λ ˆμ½”λ“œ 내뢀에 harryAgeκ°€ 26값을 가지고 μžˆμœΌλ―€λ‘œ 26을 좜λ ₯ν•œλ‹€. μœ„μ™€ 같은 μ΄μœ λ“€λ‘œ μΈν•΄μ„œ harryAge 선언문이 μ΅œμƒλ‹¨μ— λŒμ–΄μ˜¬λ €μ§„ 것 처럼 λ³΄μ΄λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것이닀.

κ·Έλ ‡λ‹€λ©΄ let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ—λ„ λ™μΌν•˜κ²Œ undefinedκ°€ 좜λ ₯될까?

μΌμ‹œμ  μ‚¬κ°μ§€λŒ€

μΌμ‹œμ  μ‚¬κ°μ§€λŒ€λž€, letκ³Ό const ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν–ˆμ„ λ•Œ μ„ μ–Έ 이전에 λ³€μˆ˜(μ‹λ³„μž)λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” μ˜μ—­μ„ λ§ν•œλ‹€. μ°Έμ‘°ν•  수 μ—†λŠ” μ΄μœ λŠ” letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μš°μ„ , var ν‚€μ›Œλ“œλŠ” μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μ§„ν–‰λœλ‹€.

var

μ†ŒμŠ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „, 평가 과정을 κ±°μΉ  λ•Œ

  • μ„ μ–Έ : μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—κ²Œ μ‹λ³„μž(harryAge)의 쑴재λ₯Ό μ•Œλ¦¬κ³  λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•œ ν›„ μ—°κ²°
  • μ΄ˆκΈ°ν™” : ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간에 μ•”λ¬΅μ μœΌλ‘œ undefined 값을 ν• λ‹Ή

μœ„ 두 과정이 λ™μ‹œμ— μ§„ν–‰λœλ‹€. λ”°λΌμ„œ, harryAge λ³€μˆ˜(μ‹λ³„μž)λ₯Ό μ„ μ–Έ 및 ν• λ‹Ήν•˜κΈ° 전에도 undefined 값을 μ°Έμ‘°ν•  수 μžˆκ²Œλ˜μ–΄ μ½˜μ†”μ— 좜λ ₯λœλ‹€.

반면, letκ³Ό const ν‚€μ›Œλ“œλŠ” μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™” 단계가 λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λœλ‹€.

let const

μ†ŒμŠ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „, 평가 과정을 κ±°μΉ  λ•Œ μ΄ˆκΈ°ν™” 단계가 μ§„ν–‰λ˜μ§€ μ•Šμ•„ 값이 바인딩 λ˜μ§€ μ•ŠλŠ”λ‹€.
(<uninitialized>λŠ” 값이 바인딩 λ˜μ§€ μ•Šμ•˜μŒμ„ ν‘œν˜„ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μ΄λ©°, <uninitialized> 값이 바인딩 된 것이 μ•„λ‹ˆλ‹€.)

tdz

μœ„ 이미지와 같이, μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„μ— μ‹€ν–‰ 흐름이 harryAge λ³€μˆ˜μ— λ³€μˆ˜ κ°’ 26을 ν• λ‹Ήν•˜κΈ° μ „ κΉŒμ§€ μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— λΉ μ§€κ²Œ λœλ‹€. μ£Όμ˜ν•  점은, letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λ„ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜λŠ” 것은 변함이 μ—†λ‹€λŠ” 것이닀.
ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•΄μ„œ λ³€μˆ˜ 선언문이 제일 μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§„ 것 처럼 λ™μž‘ν•˜μ§€λ§Œ, λ³€μˆ˜ 값을 ν• λ‹Ήν•˜κΈ° μ „ κΉŒμ§€ μ°Έμ‘°ν•  수 μ—†κΈ° λ•Œλ¬Έμ— 일지적 μ‚¬κ°μ§€λŒ€μ— λΉ μ§€κ²Œ λ˜λŠ” 것이닀.

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

  1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ
sayHi()

function sayHi() {
  console.log("μ•ˆλ…•, 해리야.")
}

μ΄λ²ˆμ—” μœ„ μ½”λ“œλ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž. ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ sayHi ν•¨μˆ˜λ₯Ό μ„ μ–Έν–ˆκ³ , ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° μ „ ν˜ΈμΆœν•˜κ³  μžˆλ‹€. μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ•Ό ν•  것 κ°™μ§€λ§Œ, μ •μƒμ μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” 것을 확인할 수 μžˆλ‹€. κ·Έ μ΄μœ λŠ”, ν•¨μˆ˜ 선언문을 톡해 μƒμ„±ν•œ ν•¨μˆ˜λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— ν•¨μˆ˜κ°€ μƒμ„±λ˜μ–΄ μ„ μ–Έ 전에도 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

declare function hoisting

μœ„ 이미지와 같이, μ „μ—­ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ „ 평가 κ³Όμ •μ—μ„œ ν•¨μˆ˜ 선언문을 톡해 μƒμ„±ν•œ sayHi ν•¨μˆ˜λŠ” μ „μ—­ 객체의 λ©”μ„œλ“œκ°€ λ˜μ–΄ 객체 ν™˜κ²½ λ ˆμ½”λ“œμ— λ“±λ‘λœλ‹€.

λ”°λΌμ„œ, μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šκ³  μ •μƒμ μœΌλ‘œ ν˜ΈμΆœλœλ‹€.

  1. ν•¨μˆ˜ ν‘œν˜„μ‹
sayHi()

var sayHi = function () {
  console.log("μ•ˆλ…•, 해리야.")
}

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό 담을 수 μžˆλ‹€. (μžλ°”μŠ€ν¬ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” 일급 객체이기 λ•Œλ¬Έμ— κ°€λŠ₯ν•˜λ‹€.)
μœ„ μ½”λ“œμ—μ„œλŠ” var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜μ— sayHi λ³€μˆ˜λ₯Ό λ‹΄μ•˜λ‹€.

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” 것을 확인할 수 μžˆλ‹€. κ·Έ μ΄μœ λŠ”, μ „μ—­ μ½”λ“œ 평가 κ³Όμ •μ—μ„œ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜λŠ” 객체 ν™˜κ²½ λ ˆμ½”λ“œμ— undefined κ°’μœΌλ‘œ λ“±λ‘λ˜λŠ”λ°, sayHi λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜κΈ° μ „ ν˜ΈμΆœν•˜λ €κ³  ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€.

funciton hoisting

TypeError: sayHi is not a function

λ”°λΌμ„œ μœ„μ™€ 같은 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.

πŸ’­ μŠ€μ½”ν”„ 체인 μ•Œμ•„λ³΄κΈ°

μœ„ μ½”λ“œ μ˜ˆμ‹œμ—μ„œ foo ν•¨μˆ˜κ°€ 싀행될 λ•Œ,
nickName, harryAge, harryHobby μ‹λ³„μžλ₯Ό μ°Ύμ•„κ°€λŠ” 과정을 톡해 μŠ€μ½”ν”„ 체인에 λŒ€ν•΄μ„œ μ’€ 더 μ•Œμ•„λ³΄μž.

var harryAge = 26

const address = "busan"

function bar() {
  var harryAge = 20

  console.log("ν•΄λ¦¬μ˜ λ‚˜μ΄λŠ”", harryAge, "μž…λ‹ˆλ‹€.")

  function foo() {
    var nickName = "harry"

    console.log(nickName)
    console.log(harryAge)
    console.log(harryHobby)
  }
  foo()
}

bar()

console.log("ν•΄λ¦¬μ˜ λ‚˜μ΄λŠ”", harryAge, "μž…λ‹ˆλ‹€.")

scope chaining

foo ν•¨μˆ˜κ°€ 호좜되면, ν•¨μˆ˜ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „ μš°μ„  평가 과정을 ν†΅ν•΄μ„œ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λœλ‹€.

ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성될 λ•Œ, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘° κ°€ κ²°μ •λ˜μ–΄μ•Ό ν•˜λ©°, foo ν•¨μˆ˜λ₯Ό ν‰κ°€ν•˜λŠ” μ‹œμ μ— μ‹€ν–‰ 쀑인 μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ μ°Έμ‘°κ²°μ •λœλ‹€. 즉, ν˜„μž¬ 평가 쀑인 foo ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” bar ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ μ°Έμ‘°κ°€ κ²°μ •λœλ‹€.

이 ν›„, 순차적으둜 foo ν•¨μˆ˜ λ‚΄λΆ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

console.log(nickName)
console.log(harryAge)
console.log(harryHobby)

console.log κ°€ μ‹€ν–‰λ˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ–΄λ–€ μ‹λ³„μžλ₯Ό 좜λ ₯할지 κ²°μ •ν•΄μ•Ό ν•œλ‹€. μ‹λ³„μžλ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄μ„œ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•˜κΈ° μ‹œμž‘ν•œλ‹€.

  1. nickName

ν˜„μž¬ 싀행쀑인 μ»¨ν…μŠ€νŠΈλŠ” foo ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μ΄λ―€λ‘œ, ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ nickName 을 μ°ΎκΈ° μ‹œμž‘ν•œλ‹€. ν˜„μž¬ 싀행쀑인 μ»¨ν…μŠ€νŠΈμ—μ„œ 찾을 수 μžˆμœΌλ―€λ‘œ μ‹λ³„μžμ— κ°’(”harry”)을 λ°”μΈλ”©ν•˜κ³  좜λ ₯ν•œλ‹€.

  1. harryAge

harryAge λŠ” foo ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ—†μœΌλ―€λ‘œ μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½μΈ bar ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ μ΄λ™ν•΄μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€. bar ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ 찾을 수 μžˆμœΌλ―€λ‘œ μ‹λ³„μžμ— κ°’(20)을 λ°”μΈλ”©ν•˜κ³  좜λ ₯ν•œλ‹€. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—λ„ λ™μΌν•œ harryAge μ‹λ³„μžκ°€ μžˆμ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 κ°€μž₯ λ¨Όμ € 발견된 μ‹λ³„μžμ—λ§Œ μ ‘κ·Όν•œλ‹€.

이 μƒν™©μ²˜λŸΌ, λ™μΌν•œ μ‹λ³„μžλ‘œ 인해 μƒμœ„ μŠ€μ½”ν”„(μ „μ—­)μ—μ„œ μ„ μ–Έλœ μ‹λ³„μžμ˜ 값이 κ°€λ €μ§€λŠ” ν˜„μƒμ„ λ³€μˆ˜ μ„€λ„μž‰μ΄λΌ ν•œλ‹€.

  1. harryHobby

harryHobby λŠ” foo ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ—†μœΌλ―€λ‘œ μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½μΈ bar ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ μ΄λ™ν•΄μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€. bar ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œλ„ 찾을 수 μ—†μœΌλ―€λ‘œ bar ν•¨μˆ˜μ˜ μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½μΈ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μœΌλ‘œ μ΄λ™ν•΄μ„œ μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€.

μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œλ„ 찾을 수 μ—†κ³ , 더 이상 μ΄λ™ν•΄μ„œ 검색할 수 μžˆλŠ” λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ Reference Error κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

μœ„ 3가지 μ˜ˆμ‹œμ²˜λŸΌ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹λ³„μžλ₯Ό μ°Ύμ•„κ°€λŠ” 과정을 μŠ€μ½”ν”„ 체이닝이라고 ν•˜λ©°, 이 κ³Όμ •μ—μ„œ ν™œμš©λ˜λŠ” μŠ€μ½”ν”„(λ ‰μ‹œμ»¬ ν™˜κ²½)λ“€μ˜ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μŠ€μ½”ν”„ 체인이라고 ν•œλ‹€.

πŸ“š 정리

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλž€, μžλ°”μŠ€λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œ ν•„μš”λ‘œ ν•˜λŠ” 정보(ν™˜κ²½)듀이 λ‹΄κ²¨μžˆλŠ” 객체이닀.
  • λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λž€, μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” ν•˜λ‚˜μ˜ λ‹¨μœ„μ΄λ©°, λ‹€μ‹œ ν™˜κ²½ λ ˆμ½”λ“œ, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰둜 κ΅¬λΆ„λœλ‹€.
  • λ ‰μ‹œμ»¬ ν™˜κ²½μ€ ν‚€, 값을 κ°–λŠ” 객체 ν˜•νƒœμ˜ μŠ€μ½”ν”„(ν™˜κ²½ λ ˆμ½”λ“œ)λ₯Ό μƒμ„±ν•˜κ³ , μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°(μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°)λ₯Ό κΈ°λ‘ν•œλ‹€.
  • ν˜Έμ΄μŠ€νŒ…μ€ 선언문이 μ΅œμƒλ‹¨μ— λŒμ–΄μ˜¬λ €μ§„ λ“―ν•œ ν˜„μƒμ„ λ§ν•˜λ©°, μ†ŒμŠ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μ „ 평가λ₯Ό 톡해 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— μƒκΈ°λŠ” ν˜„μƒμœΌλ‘œ λ³Ό 수 μžˆλ‹€.
  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜μ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λ™μ‹œμ— μ§„ν–‰λ˜λ©°, letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ³€μˆ˜μ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λΆ„λ¦¬λ˜μ–΄ μ§„ν–‰λœλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹λ³„μžλ₯Ό κ²°μ •ν•΄κ°€λŠ” 과정을 μŠ€μ½”ν”„ 체이닝이라고 ν•˜λ©°, 이 κ³Όμ •μ—μ„œ ν™œμš©λ˜λŠ” μŠ€μ½”ν”„(λ ‰μ‹œμ»¬ ν™˜κ²½)λ“€μ˜ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μŠ€μ½”ν”„ 체인이라고 ν•œλ‹€.
@μ΅œν˜„μ›…(Harry)
의미 μ—†λŠ” 기둝은 μ—†λ‹€κ³  μƒκ°ν•˜λ©°, ν•™μŠ΅ν•˜κ³  λŠλ‚€ 것듀을 κΈ°λ‘ν•©λ‹ˆλ‹€ :)