μλ°μ€ν¬λ¦½νΈ 곡λΆλ₯Ό μμν λ λΆν°, μ€ν 컨ν μ€νΈλ μλ°μ€ν¬λ¦½νΈμ λͺ¨λ κ²μ λ΄κ³ μλ€κ³ ν΄μ νμ 무μμΈμ§ κΆκΈνλ€. μ΄λ² ν¬μ€ν μ μ€ν 컨ν μ€νΈμ λν΄ μ 리νλ€.
λ³Έ ν¬μ€ν μ μ΄μ λͺ¨λμ λͺ¨λ μλ°μ€ν¬λ¦½νΈ deep dive 19μ₯μ μ°Έμ‘°νμ¬ μμ± νμμ΅λλ€.
ECMAScript μ€νμ λ°λ₯΄λ©΄ μ€ν 컨ν μ€νΈλ₯ΌΒ μ€ν κ°λ₯ν μ½λλ₯Ό νμννκ³ κ΅¬λΆνλ μΆμμ μΈ κ°λ μ΄λΌκ³ μ μνλ€. μ’ λ μ½κ² λ§νμλ©΄Β μ€ν 컨ν μ€νΈλ μ€ν κ°λ₯ν μ½λκ° μ€νλκΈ° μν΄ νμν νκ²½μ΄λ€.
μ΄ μ± μμλ μμ€μ½λλ₯Ό 4κ°μ§λ‘ λΆλ₯νλ€. λΆλ₯ μ΄μ λ μμ€μ½λμ νμ μ λ°λΌ μ€ν 컨ν μ€νΈλ₯Ό μμ±νλ κ³Όμ κ³Ό κ΄λ¦¬ λ΄μ©μ΄ λ€λ₯΄κΈ° λλ¬Έμ΄λ€.
μ΄ ν¬μ€ν μμλ μ μμ½λμ ν¨μ μ½λμ λν΄μλ§ μ΄ν΄λ³Έλ€.
μ μ μ½λλ μ μ λ³μλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ΅μμ μ€μ½νμΈ μ μ μ€μ½νλ₯Ό μμ±ν΄μΌ νλ€. κ·Έλ¦¬κ³ var ν€μλλ‘ μ μΈλ μ μ λ³μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μ μ ν¨μλ₯Ό μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλλ‘ λ°μΈλ©νκ³ μ°Έμ‘°νκΈ° μν΄ μ μ κ°μ²΄μ μ°κ²°λμ΄μΌ νλ€.
μ μ μ½λκ° νκ°λλ©΄ μ μ μ€ν 컨ν μ€νΈκ° μμ±λλ€.
ν¨μ μ½λλ μ§μ μ€μ½λλ₯Ό μμ±νκ³ μ§μ λ³μ, 맀κ°λ³μ ,arguments κ°μ²΄λ₯Ό κ΄λ¦¬ν΄μΌ νλ€. κ·Έλ¦¬κ³ μμ±ν μ§μ μ€μ½νλ₯Ό μ μ μ€μ½νμμ μμνλ μ€μ½ν 체μΈμ μΌμμΌλ‘ μ°κ²°ν΄μΌ νλ€.
ν¨μ μ½λκ° νκ°λλ©΄ ν¨μ μ€ν 컨ν μ€νΈκ° μμ±λλ€.
λͺ¨λ μ½λλ "νκ°" β "μ€ν"μ μμλ‘ μ΄μ΄μ§λ€!!
λ€μ μ½λλ₯Ό μ΄ν΄λ³΄μ.
μ μ½λμ μ€νμ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ μ΄λ£¨μ΄μ§λ€.
μ μ μ½λ νκ°
μμ€μ½λ νκ° κ³Όμ μμλ μ μΈλ¬Έλ§ λ¨Όμ μ€ννλ€(undefinedλ‘ μ΄κΈ°ν). var ν€μλλ‘ μ μΈλ μ μ λ³μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μ μ ν¨μλ μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλκ° λλ€.
μ μ μ½λ μ€ν
μ μ μ½λ νκ° κ³Όμ μ΄ λλλ©΄ λ°νμμ΄ μμλμ΄ μ μ μ½λκ° μμ°¨μ μΌλ‘ μ€νλκΈ° μμνλ€. μ΄λ μ μ λ³μμ κ°μ΄ ν λΉλκ³ ν¨μκ° νΈμΆλλ€. ν¨μκ° νΈμΆλλ©΄ μμ°¨μ μΌλ‘ μ€νλλ μ μ μ½λμ μ€νμ μΌμ μ€λ¨νκ³ μ½λ μ€νμμλ₯Ό λ³κ²½νμ¬ ν¨μ λ΄λΆλ‘ μ§μ νλ€.
μ¦ , foo(100)μ λ§λλ©΄ μ μμ½λ μ€νμ λ©μΆκ³ foo ν¨μλ₯Ό νκ°νκΈ° μμνλ€.
ν¨μ μ½λ νκ°
λ§μ°¬κ°μ§λ‘ ν¨μ λΈλ‘ λ΄λΆμμ 맀κ°λ³μμ μ§μλ³μλ₯Ό λ¨Όμ μ μΈλ¬Έμ μ€ννκ³ , λ³μκ° μ€ν 컨ν μ€νΈκ° κ΄λ¦¬νλ μ§μ μ€μ½νμ λ±λ‘λλ€. λν argument κ°μ²΄λ₯Ό μμ±νκ³ this λ°μΈλ©μ κ²°μ νλ€.
ν¨μ μ½λ μ€ν
ν¨μ μ½λλ₯Ό μμ°¨μ μΌλ‘ μ€ννκΈ° μμνλ€. μ΄λ console.logλ₯Ό λ§λλ©΄ μλ³μμΈ consoleμ μ€μ½ν 체μΈμ ν΅ν΄ κ²μνλ€. μ΄λ₯Ό μν΄ ν¨μ μ½λμ μ§μ μ€μ½νλ μμ μ€μ½νμΈ μ μ μ€μ½νμ μ°κ²°λμ΄μΌ νλ€.(consoleμ global ν¨μμ propertyμ)
π‘ μ¬κΈ°μ μ°λ¦¬λ λ³μ νΈμ΄μ€ν μ μ리μ λν΄μ μ μ μλ€. μ½λκ° μ€νλκΈ° μ νκ°λλ κ³Όμ μμ λ³μλ μ΄λ―Έ μμ±λλ κ²μ΄λ€!
μ μ½λμ μ€ν κ³Όμ μ 보며 μ μ μ λ―μ΄, μ½λκ° μ€νλκΈ° μν΄μλ μ€μ½ν, μλ³μ, μ½λ μ€ν μμλ±μ κ΄λ¦¬κ° νμνλ€.
μ΄ λͺ¨λ κ²μ κ΄λ¦¬νλ κ²μ΄ λ°λ‘ μ€ν 컨ν μ€νΈλ€. μ€ν 컨ν μ€νΈλ μλ³μ(λ³μ, ν¨μ, ν΄λμ€)λ₯Ό λ±λ‘νκ³ κ΄λ¦¬νλ μ€μ½νμ μ½λ μ€ν μμ κ΄λ¦¬λ₯Ό ꡬνν λ΄λΆ λ©μ»€λμ¦μΌλ‘, λͺ¨λ μ½λλ μ€ν 컨ν μ€νΈλ₯Ό ν΅ν΄ μ€νλκ³ κ΄λ¦¬λλ€.
κ·Έλ λ€λ©΄ μ€ν 컨ν μ€νΈλ μ΄λ»κ² μ΄λ£¨μ΄μ Έ μκ³ μΈμ μμ±λλ κ²μΌκΉ?
μ€ν 컨ν μ€νΈλ ν¬κ² λκ°μ§ μμλ‘ μ 리ν μ μλ€.
μ€ν 컨ν μ€νΈ μ€νμ λ§ κ·Έλλ‘ μ½λμ μ€ν μμλ₯Ό κ΄λ¦¬νλ μ€ν(stack)μ΄λ€.
μ μ½λλ₯Ό 보μ. μμ λ§νλ―, λͺ¨λ μ½λλ νκ°λ₯Ό κ±°μ³ μ€νλλ€. λ°λΌμ μ μ½λλ λ€μκ³Ό κ°μ λ¨κ³λ₯Ό κ±°μ³ μ€νλλ€.
μ μ μ½λμ νκ°μ μ€ν β foo ν¨μ μ½λμ νκ°μ μ€ν β bar ν¨μ μ½λμ νκ°μ μ€ν β foo ν¨μ μ½λλ‘ λ³΅κ· β μ μ μ½λλ‘ λ³΅κ·
κ° κ³Όμ μμ μ€ν컨ν μ€νΈ μ€νμ 보면 λ€μκ³Ό κ°λ€.
ν¨μκ° νΈμΆλ λ λ§λ€, μ€ν 컨ν μ€νΈκ° νλμ© μμ±λμ΄ μ€νμ μμΈλ€.
μ¦, μ€ν 컨ν μ€νΈ μ΅μμμ μ‘΄μ¬νλ μ€ν 컨ν μ€νΈλ μΈμ λ νμ¬ μ€ν μ€μΈ μ½λμ μ€ν 컨ν μ€νΈμ΄κ³ , κ°κ°μ μ€ν 컨ν μ€νΈλ λ μ컬 νκ²½μ κ°μ§λ€.
μ€ν 컨ν μ€νΈ μ€νμ μ½λμ μ€ν μμλ₯Ό κ΄λ¦¬νλ€λ©΄ λ μ컬 νκ²½μ μ€μ½νμ μλ³μλ₯Ό κ΄λ¦¬νλ€.
λ μ컬 νκ²½μ λ€μκ³Ό κ°μ λκ°μ μ»΄ν¬λνΈλ‘ ꡬμ±λλ€.
EnvironmentRecord(νκ²½λ μ½λ)
μ€μ½νμ ν¬ν¨λ μλ³μλ₯Ό λ±λ‘νκ³ λ±λ‘λ μλ³μμ λ°μΈλλ κ°μ κ΄λ¦¬νλ μ μ₯μμ΄λ€. μ½κ² λ§νλ©΄ λ μ컬 νκ²½μ κ° μ€ν 컨ν μ€νΈ λ§λ€ μ‘΄μ¬νλ©° κ·Έ μ€ν 컨ν μ€νΈμμ λ³μμ thisλ±μ κ΄λ¦¬νλ€.
OuterLexicalEnvironmentReference(μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°)
μμ μ€μ½ν μ°Έμ‘°λ₯Ό μν΄ μλ μ»΄ν¬λνΈμ΄λ€. μ΄λ₯Ό ν΅ν΄μ μμ μ€μ½νλ₯Ό μ°Έμ‘°ν μ μκΈ° λλ¬Έμ μ€μ½ν 체μΈμ΄ νμ±λκ³ , μλ³μλ₯Ό κ²μ κ°λ₯νλ€!
λ΄μ©μ΄ κΈΈμλλ°, λ§μ§λ§μΌλ‘ μ 리ν΄λ³΄μ.
ν¨μκ° μ€νλλ©΄ μ€ν 컨ν μ€νΈμ μλ‘μ΄ μ€νμ΄ μμ΄κ³ , κ°κ°μ μ€ν 컨ν μ€νΈλ λ μ컬 νκ²½μ κ°μ§κ³ μλ€.
λ μ컬 νκ²½μ κ·Έ μ€ν 컨ν μ€νΈμ λ³μμ λν μ 보μ μμ μ€μ½νμ λν μ 보, this λ°μΈλ© μ 보λ₯Ό κ°μ§κ³ μλ€.
μ΄ μ± μ λ§ κ·Έλλ‘ μλ°μ€ν¬λ¦½νΈμ 맀λ ₯μ κΉκ² λΉ μ§κ² ν΄μ£Όλ μ± μΈ κ² κ°λ€. μ²μ μ½μμλ μ μ΄ν΄κ° μλμ΄μ, μ§μ€ν΄μ μΈλ² μ λ μ½μλλ μμμ 곡λΆνλ λ³μ hoisting, scope chainμ΄ μ λ°μνλμ§ μ΄ν΄ν μ μμλ€.
μλ°μ€ν¬λ¦½νΈλ₯Ό κΉκ² 곡λΆνκ³ μΆμ λΆμ΄ μλ€λ©΄ κΌ μ½λκ²μ μΆμ²λλ¦°λ€.