μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μ€ννκΈ° μ μ μ½λλ₯Ό νκ°νλ κ³Όμ μ κ±°μΉλ€. κ·Έ νμ μ μΈλ¬Έμ μ μΈν μμ€μ½λκ° μ€νλλ€. μ΄ λ, μ½λλ₯Ό νκ°νλ κ³Όμ μμ μμ€μ½λλ₯Ό μ€νν λ μ 곡ν νκ²½ μ 보λ₯Ό λͺ¨μλμ κ°μ²΄λ₯Ό μμ±νλλ° μ΄ κ°μ²΄κ° μ€ν 컨ν μ€νΈμ΄λ€.
μμ€μ½λλ ECMAScript μ¬μμ λ°λΌ 4κ°μ§ νμ
μΌλ‘ ꡬλΆλλ€. 4κ°μ§ νμ
μ μμ€μ½λλ μ€ν 컨ν
μ€νΈλ₯Ό μμ±νλ€. (μ½μ΄ μλ°μ€ν¬λ¦½νΈλ ES6λΆν°λ λΈλ‘μ μν΄μλ μ€ν 컨ν
μ€νΈκ° μμ±λλ€κ³ νλ€. κ·Έλ¬λ λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Diveλ λΈλ‘μ μν΄μλ μλ‘μ΄ LexicalEnvironment
λ§ μμ±λμ΄ μ½λ λΈλ‘μ΄ μ€νλλ λμ κ΅μ²΄νλ€κ³ νλ€. μ΄λ μͺ½μ΄ λ§λμ§ λͺ¨λ₯΄κ² λ€. ()μμ λ΄μ©μ μμ§ μ΄ν΄κ° μ λμ΄λ μκ΄μλ€. λμ€μ κΈμ λ€ μ½κ³ ν λ² μ¬λΌμμ μ΄ν΄λ§ λ΄λΌ.)
μ μ μ½λ, ν¨μ μ½λ, eval μ½λ, λͺ¨λ μ½λλ‘ κ΅¬λΆλλ€.
μ΄ κΈμμλ μ μ μ½λμ ν¨μ μ½λλ‘ μμ±λλ μ€ν 컨ν μ€νΈλ§ λ€λ£¨λλ‘ νκ² λ€.
μ μ μ½λλ μ μ μ€ν 컨ν μ€νΈλ₯Ό μμ±νκ³ , ν¨μ μ½λλ ν¨μ μ€ν 컨ν μ€νΈλ₯Ό μμ±νλ€. μΌλ¨ μ¬κΈ°κΉμ§λ§ μκ³ , λμ΄ λκ° λ€λ₯Έμ§λ μλμμ μ΄ν΄λ³΄λλ‘ νμ.
μμ±λ μ€ν 컨ν μ€νΈλ μ½ μ€νμ ν΅ν΄μ κ΄λ¦¬λλ€. 맨 μμμ μ€λͺ ν μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ μμ€μ½λλ νκ°(Creation Phase), μ€ν(Execution Phase) λ λ¨κ³λ‘ λλμ΄ μ²λ¦¬λλ€κ³ νλλ° μ΄μ λν νλ¦μ μ§μ€ν΄ μλ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ μ’μ κ² κ°λ€. κ·ΈλΌ μλμ μμ μ½λμ λμμ 보면μ μ€ν 컨ν μ€νΈκ° μ΄λ»κ² λμκ°λκ±΄μ§ μ’ λ μ°λ¨Ήν΄λ³΄μ.
//---- 1
const a = 1;
function foo() {
const b = 2;
console.log(b); //---- 3
}
foo(); //---- 2
console.log(a); //---- 4
μ£Όμμ λ¬μ λμ μμλλ‘ μ½λ μ§νμ μ€λͺ νλλ‘ νκ² λ€.
μ μ μ€ν 컨ν
μ€νΈ μμ±
μ μ μ½λλ₯Ό μ€ννκΈ°μ μμ λ¨Όμ μ μ μ½λ νκ° κ³Όμ μ κ±°μΉκ³ μ μ μ€ν 컨ν
μ€νΈλ₯Ό μμ±νλ€. μμ±ν μ μ 컨ν
μ€νΈλ μ½ μ€νμ μμΈλ€. μ½ μ€ν 맨 μμ μμ¬μλ μ€ν 컨ν
μ€νΈλ μ μ μ€ν 컨ν
μ€νΈμ΄κΈ° λλ¬Έμ μ μ μ½λκ° μ€νλλ€.
foo ν¨μ μ€ν 컨ν
μ€νΈ μμ±
μ μ μ½λλ₯Ό μ€ννλ€κ° foo();
λ₯Ό λ§λλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ foo ν¨μ μ½λλ₯Ό νκ°ν΄ foo ν¨μ μ€ν 컨ν
μ€νΈλ₯Ό μμ±νλ€. μμ±ν foo ν¨μ μ€ν 컨ν
μ€νΈλ μ½ μ€νμ μμΈλ€. μ΄μ μ½ μ€ν 맨 μμ μμ¬μλ μ€ν 컨ν
μ€νΈλ μ μ μ€ν 컨ν
μ€νΈκ° μλλΌ foo ν¨μ μ€ν 컨ν
μ€νΈκ° λμλ€. μ μ μ½λμ μ€νμ μ€μ§λκ³ , foo ν¨μ λ΄λΆ μ½λκ° μ€νλλ€.
foo ν¨μ μ€ν μ’
λ£
console.log(b)
λ₯Ό μ€ννκ³ λλ©΄ foo ν¨μμ μ€νμ΄ μ’
λ£λλ©΄μ foo ν¨μ μ€ν 컨ν
μ€νΈκ° μ½ μ€νμμ μ κ±°λλ€. μ΄μ μ½ μ€ν 맨 μμ μμ¬μλ μ€ν 컨ν
μ€νΈλ μ μ μ€ν 컨ν
μ€νΈμ΄κΈ° λλ¬Έμ μ€νμ μ€λ¨νλ foo();
μ€μ λ€μ μ€λΆν° μ΄μ΄μ μ€νλλ€.
μ μ μ½λ μ€ν μ’
λ£
console.log(a)
λ₯Ό μ€ννκ³ λλ©΄ μ μ μ½λμ μ€νμ΄ μ’
λ£λλ©΄μ μ μ μ€ν 컨ν
μ€νΈκ° μ½ μ€νμμ μ κ±°λλ€. μ½ μ€νμλ μ무κ²λ λ¨μ§ μμ μνλ‘ νλ‘κ·Έλ¨μ μ’
λ£λλ€.
μ΄μ²λΌ μ½ μ€νμ μ½λμ μ€ν μμλ₯Ό κ΄λ¦¬νλ€. μμ€μ½λκ° νκ°λλ©΄ μ€ν 컨ν μ€νΈκ° μμ±λκ³ μ½ μ€νμ μ΅μμμ μμΈλ€. μ½ μ€νμ μ΅μμμ μ‘΄μ¬νλ μ€ν 컨ν μ€νΈλ μΈμ λ νμ¬ μ€ν μ€μΈ μ½λμ μ€ν 컨ν μ€νΈμ΄λ€. μ½ μ€νμ μ΅μμμ μ‘΄μ¬νλ μ€ν 컨ν μ€νΈλ₯Ό μ€ν μ€μΈ μ€ν 컨ν μ€νΈ(running excution context)λΌκ³ λΆλ₯Έλ€.
μμμλ μ€ν 컨ν μ€νΈκ° μ½λλ₯Ό νκ°νλ κ³Όμ μμ μμ€μ½λλ₯Ό μ€νν λ μ 곡ν νκ²½ μ 보λ₯Ό λͺ¨μλμ κ°μ²΄ λΌκ³ λ§ μκΈ°ν΄λκ³ μ΄λ€ νκ²½ μ 보λ₯Ό λͺ¨μλμκ±΄μ§ νλλ μ€λͺ νμ§ μμλ€. μ΄μ μ€ν 컨ν μ€νΈμ ꡬμ±μμλ₯Ό μ΄ν΄λ³΄λ©΄μ μ΄ν΄λ³΄μ.
μ€ν 컨ν
μ€νΈλ VariableEnvironment
, LexicalEnvironment
μ»΄ν¬λνΈλ‘ ꡬμ±λλ€. (μ¬μ€μ μ΄κ²λ³΄λ€ λ 볡μ‘ν ꡬ쑰λ₯Ό κ°μ§κ³ μλ€..) ꡬ쑰λ₯Ό μ΄ν΄λ³΄μλ©΄ μλμ κ°λ€.
- VariableEnvironment (LexivalEnvironmentμ ꡬ쑰 κ°μ)
- LexicalEnvironment
- EnvironmentRecord
- ObjectEnvironmentRecord (μ μ μ€ν 컨ν μ€νΈλ§ μ‘΄μ¬ν¨)
- DeclarativeEnvironmentRecord (μ μ μ€ν 컨ν μ€νΈλ§ μ‘΄μ¬ν¨)
- [[ThisValue]] (μ μ μ€ν 컨ν μ€νΈλ [[GlobalThisValue]])
- OuterLexicalEnvironmentReference
κ°κ°μ΄ μ€ν 컨ν μ€νΈ κ°μ²΄κ° μμ±λ λ μ΄λ€ νκ²½ μ 보λ₯Ό λͺ¨μ λλμ§, λ¬΄μ¨ μν μ νλμ§λ μλμμ μμλλ‘ μ΄ν΄λ³΄λλ‘ νμ.
VariableEnvironment
λ νμ¬ μ»¨ν
μ€νΈ λ΄λΆμ μλ³μλ€μ λν μ 보, μμ μ€μ½νμ λν μ°Έμ‘°λ₯Ό κΈ°λ‘νλ μλ£κ΅¬μ‘°μ΄λ€. μ€ν 컨ν
μ€νΈκ° μμ±λ λ, VariableEnvironment
μ λ΄κΈ°λ λ΄μ©μ LexicalEnvironment
μ κ°μ§λ§, μ΅μ΄ μ€ν μμ μ€λ
μ·μ μ μ§νλ€λ μ μ΄ λ€λ₯΄λ€. VariableEnvironment
κ° μμ±λκ³ μ΄λ₯Ό κ·Έλλ‘ λ³΅μ¬ν΄ LexicalEnvironment
λ₯Ό λ§λ€κ³ μ΄νμλ μ£Όλ‘ LexicalEnvironment
λ₯Ό νμ©νκ² λλ€.
(μ΄λ μ½μ΄ μλ°μ€ν¬λ¦½νΈμ μ€λͺ
μΈλ°, λ₯ λ€μ΄λΈμλ λ€λ₯Έ λΆλΆμ΄ κ½€ μλ€. μΆκ°λ‘ 곡λΆν΄μ μμλ΄λ λ΄μ©μ΄ μμΌλ©΄ λ μ λλ‘ νκ² λ€)
κ·ΈλμVariableEnvironment
μ λν μ€λͺ
μ μ¬κΈ°κΉμ§λ§ νκ³ μμΈν μ¬νμ μ²μμλ κ°μ§λ§ μ½λ μ§νμ λ°λΌ λ¬λΌμ§κ² λ LexicalEnvironment
μμ λ€λ£¨λλ‘ νκ² λ€.
κ·Έλ¦¬κ³ μ΄ κΈμμλ λμ ꡬλΆνμ§ μκ³ LexicalEnvironment
μΌλ‘ ν΅μΌν΄ κ°λ΅νκ² μ€λͺ
νκ² λ€.
LexicalEnvironment
λ VariableEnvironment
μ λ§μ°¬κ°μ§λ‘ νμ¬ μ»¨ν
μ€νΈ λ΄λΆμ μλ³μλ€μ λν μ 보, μμ μ€μ½νμ λν μ°Έμ‘°λ₯Ό κΈ°λ‘νλ μλ£κ΅¬μ‘°μ΄λ€. LexicalEnvironment
λ ν€μ κ°μ κ°λ κ°μ²΄ ννμ μ€μ½νλ₯Ό μμ±νμ¬ μλ³μλ₯Ό ν€λ‘ λ±λ‘νκ³ μλ³μμ λ°μΈλ©λ κ°μ κ΄λ¦¬νλ€. μ½ μ€νμ΄ μ½λμ μ€ν μμλ₯Ό κ΄λ¦¬νλ€λ©΄ LexicalEnvironment
λ μ€μ½νμ μλ³μλ₯Ό κ΄λ¦¬νλ€.
LexicalEnvironment
μ EnvironmentRecord
μ»΄ν¬λνΈμλ νμ¬ μ»¨ν
μ€νΈμ κ΄λ ¨λ μ½λμ μλ³μ μ 보λ€μ΄ μ μ₯λλ€. ν¨μ μ€ν 컨ν
μ€νΈμ κ²½μ° ν¨μ λͺΈμ²΄ λ΄λΆμμ μ μΈλ λ³μ, ν¨μ, arguments
κ°μ²΄, 맀κ°λ³μκ° λ±λ‘λμ΄ κ΄λ¦¬λλ€. EnvironmentRecord
λ΄λΆ μ¬λ‘― [[ThisValue]]
μλ thisκ° λ°μΈλ©λλ€. (thisμ λν΄μλ λ€μμ μμ보λλ‘ νκ² λ€.)
μ μ μ€ν 컨ν
μ€νΈλ μ‘°κΈ λ€λ₯΄λ€. μ μ μ€ν 컨ν
μ€νΈμ EnvironmentRecord
λ μ μ λ³μλ₯Ό κ΄λ¦¬νλ μ μ μ€μ½ν, μ μ κ°μ²΄μ λΉνΈμΈ μ μ νλ‘νΌν°μ λΉνΈμΈ μ μν¨μ, νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό μ 곡νλ€. var
λ‘ μ μΈν μ μ λ³μλ μ μ κ°μ²΄μ νλ‘νΌν°κ° λμ§λ§ let
,const
λ‘ μ μΈν μ μ λ³μλ κ·Έλ μ§ μλ€.
μ΄ λμ ꡬλΆν΄ κ΄λ¦¬νκΈ° μν΄ μ μ μ€ν 컨ν
μ€νΈμ EnvironmentRecord
λ
ObjectEnvironmentRecord
μ DeclarativeEnvironmentRecord
λ‘ κ΅¬μ±λμ΄μλ€.
ObjectEnvironmentRecord
λ BindingObject
λΌκ³ λΆλ₯΄λ κ°μ²΄μ μ°κ²°λλ€. μ΄λ μ μ μ½λλ₯Ό νκ°νκΈ° μ μ μμ±λ μ μ κ°μ²΄μ΄λ€. μ μ μ½λ νκ° κ³Όμ μμ var
ν€μλλ‘ μ μΈλ μ μ λ³μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μ μ ν¨μλ μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλκ° λλ€.
DeclarativeEnvironmentRecord
λ let
, const
ν€μλλ‘ μ μΈν μ μ λ³μμ let
, const
ν€μλλ‘ μ μΈν μ μ λ³μμ ν λΉν ν¨μ ννμμ λ±λ‘ν΄ κ΄λ¦¬νλ€.
λ§μ§λ§μΌλ‘ EnvironmentRecord
μ [[GlobalThisValue]]
λ΄λΆ μ¬λ‘―μ thisκ° λ°μΈλ©λλ€.
OuterEnvironmentReference
λ ν¨μ μ μκ° νκ°λ μμ μ μ€ν μ€μΈ μ€ν 컨ν
μ€νΈμ LexicalEnvironment
, μ¦ μμ μ€μ½νλ₯Ό κ°λ¦¬ν¨λ€. μ΄λ₯Ό ν΅ν΄ μ λ² κΈμμ μμλ΄€λ μ€μ½ν 체μΈμ΄ λ¨λ°©ν₯ μ°κ²° 리μ€νΈλ‘ ꡬνλλ€. νΉμ μ€μ½ν 체μΈμ΄λ, λ μ컬 μ€μ½νμ λν΄ μ νν λͺ¨λ₯΄κ² λ€λ©΄ μ΄μ κΈμ μ½κ³ μ€λ κ²μ μΆμ²νλ€.
β‘οΈ μλ°μ€ν¬λ¦½νΈμ μ€μ½ν
νΈμ΄μ€ν μ΄λ, μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ λ³μμ μ μΈκ³Ό μ΄κΈ°ν λ¨κ³κ° λΆλ¦¬λμ΄ μ§νλ λ, λ³μμ μ μΈ λ¨κ³λ λ³μμ μ μΈλ¬Έμ΄ μ€ν 컨ν μ€νΈμ μ΅μλ¨μΌλ‘ λμ΄μ¬λ €μ§ κ²μ²λΌ μ§νλλ νμμ λ§νλ€. (μ€μ λ‘ λ¬Όλ¦¬μ μΌλ‘ λ³μμ μ μΈλ¬Έμ΄ μ€ν 컨ν μ€νΈμ μ΅μλ¨μΌλ‘ λμ΄ μ¬λ €μ§μ§ μλλ€.)μ΄λ λ³μ λΏλ§ μλλΌ ν¨μμλ μ μ©λλ€.
μλ°μ€ν¬λ¦½νΈκ° μμ€μ½λλ₯Ό νκ°ν λ, μμ€μ½λμ μ μΈλ¬Έλ§ μ€νν΄ μλ³μλ€μ΄ μμμλΆν° μλμ μμλλ‘ LexicalEnvironment
μ EnvironmentRecord
μ ν€(key)λ‘ λ±λ‘λλ€. μ΄λ κ² μ€ν 컨ν
μ€νΈκ° λ§λ€μ΄μ§ μμ κΉμ§λ κ°μ΄ ν λΉλμ΄μμ§μλ€. (varν€μλλ‘ λ§λ λ³μλ μ μΈ, μ΄κΈ°νλ¨κ³κ° ν λ²μ μ€νλμ΄ undefinedλ‘ μ묡μ μΌλ‘ μ΄κΈ°νλλ€. μ΄ λ΄μ©μ΄ μλ‘κ² λκ»΄μ§λ€λ©΄ μλ κΈμ μ½κ³ μλΌ.)
β‘οΈ μλ°μ€ν¬λ¦½νΈμ λ³μμ λ°μ΄ν° νμ
κ·Έλ¬κ³ λμ μμ€μ½λ νκ°κ° μλ£λκ³ μ€ν 컨ν
μ€νΈ κ°μ²΄κ° λ§λ€μ΄μ Έ μ½ μ€νμ μμ΄λ©΄ μ μΈλ¬Έμ μ μΈν μμ€μ½λμ μ€νμ΄ μμλλ©΄μ μλ³μμ κ°μ ν λΉνλ μ½λλ₯Ό λ§λλ©΄ LexicalEnvironment
μ EnvironmentRecord
μ ν€(key)λ‘ μ μ₯λ μλ³μμ κ°(value)μ΄ ν λΉλλ€.
μμμ μ΄ν΄λ³Έ λ³μ νΈμ΄μ€ν
μ΄ μΌμ΄λλ κ³Όμ μ μ½λλ‘ μ΄ν΄λ³΄μ. λ³μ νΈμ΄μ€ν
μ var
ν€μλλ‘ μ μΈν λ³μμ let
, const
λ‘ μ μΈν λ³μκ° λ€λ₯΄κ² λνλλ―λ‘ λ°λ‘ λ°λ‘ μ΄ν΄λ³΄κ² λ€.
console.log(num); // undefined
var num = 10;
console.log(num); // 10
μ μ κ°μ²΄ μμ±
λμ€μ λ€λ£¨κ² λκ² μ§λ§ μμ€μ½λκ° νκ°λκΈ° μ΄μ μ μ μκ°μ²΄κ° μ€νλλ€.
μμ€μ½λ νκ°
μμ€μ½λ νκ° κ³Όμ μμ μ μΈλ¬Έλ§ λ¨Όμ μ€ννλ€. μ΄ λ μ μ μ€ν 컨ν
μ€νΈμ LexicalEnvironment
μ EnvironmentRecord
μ DeclarativeEnvironmentRecord
μ μλ³μ num
μ΄ ν€λ‘ λ±λ‘λλ€. var
ν€μλλ‘ μμ±λμκΈ° λλ¬Έμ μ μΈκ³Ό μ΄κΈ°νκ° λμμ μ΄λ£¨μ΄μ Έ κ°μΌλ‘ undefined
κ° ν λΉλλ€. (thisλ°μΈλ©κ³Ό OuterEnvironmentReference
μ€μ μ νΈμ΄μ€ν
κ³Ό μ°κ΄μ΄ μμ΄ μλ΅νλ€.)
첫λ²μ§Έ 'console.log'
μμ€μ½λ νκ°κ° λλλ©΄ μ μΈλ¬Έμ μ μΈν μμ€μ½λκ° μ€νλλ€. 첫λ²μ§Έμ€μ console.log(num)
λ₯Ό λ§λλ©΄ (μ¬μ€ console μλ³μλ κ²μνκ³ μ΄λ¬μ λ¬ν κ³Όμ μ λ κ±°μΉμ§λ§ μλ΅νκ² λ€.) num
μλ³μλ₯Ό νμ¬ μ€ν 컨ν
μ€νΈμ (μ μ½λμμλ μ μ μ€ν 컨ν
μ€νΈ) LexicalEnvironment
μμ λ±λ‘λμ΄ μλμ§ μ°Ύλλ€. μ§κΈμ λ±λ‘λμ΄μκΈ° λλ¬Έμ num
μ κ°μΈ undefined
λ₯Ό μΆλ ₯νλ€.
var num = 10;
μ μΈλ¬Έ λΆλΆμ μ μΈνκ³ 'num = 10'λ§ μ€νν΄ λ±λ‘λ num
μ κ°μ 10
μΌλ‘ μ¬ν λΉνλ€.
λλ²μ§Έ 'console.log'
λ λ€μ num
μλ³μλ₯Ό νμ¬ μ€ν 컨ν
μ€νΈμ (μ μ½λμμλ μ μ μ€ν 컨ν
μ€νΈ)μ LexicalEnvironment
μμ λ±λ‘λμ΄ μλμ§ μ°Ύλλ€. μμλ λ±λ‘λμ΄μκΈ° λλ¬Έμ num
μ κ°μΈ 10
μ μΆλ ₯νλ€.
μ΄λ¬ν κ³Όμ μ κ²ͺμ΄ λ³μ νΈμ΄μ€ν
μ΄λΌλ νμμ΄ μΌμ΄λλ€. let
, const
ν€μλλ‘ μ μΈν λ³μλ μ΄λ»κ² var
ν€μλλ‘ μ μΈν λ³μμ λ€λ₯Έμ§ μ΄ν΄λ³΄μ.
console.log(num); // Reference Error
var num = 10;
console.log(num); // 10
let
μ΄λ const
λ‘ μ μΈν λ³μλ var
ν€μλμ λ¬λ¦¬ "μ μΈ"κ³Ό "μ΄κΈ°ν"λ¨κ³κ° λΆλ¦¬λμ΄ μΌμ΄λκΈ° λλ¬Έμ λ°νμμ μ€ν νλ¦μ΄ λ³μ μ μΈλ¬Έμ λλ¬νκΈ° μ κΉμ§ μ무 κ°λ λ³μκ° λ΄κ²¨μμ§ μμλ°, μ΄ λ λ³μμ μ κ·Όν μ μκΈ° λλ¬Έμ λ³μ μ μΈλ¬Έμ λλ¬νκΈ° μ κΉμ§λ₯Ό μΌμμ μ¬κ°μ§λ(Temporal Dead Zone) TDZλΌκ³ λΆλ₯Έλ€.
μ΄ λλ¬Έμ 첫λ²μ§Έ console.logκ° μ€νλ λ μ μ μ€ν 컨ν
μ€νΈμ λ±λ‘λ num
μλ μμ§ κ°μ΄ μκΈ° λλ¬Έμ numμ μΌμμ μ¬κ°μ§λμ λΉ μ Έ μλ μνμ΄λ€. κ·Έλμ Reference Errorκ° λ°μνλ€.
μ¦, var
ν€μλλ‘ λ³μλ₯Ό λ§λ€λ let
, const
ν€μλλ‘ λ³μλ₯Ό λ§λ€λ νΈμ΄μ€ν
μ μΌμ΄λμ§λ§ var
ν€μλλ‘ λ§λ λ³μλ μ μΈλ¬Έμ λλ¬νκΈ° μ μ λ³μλ₯Ό μ°Έμ‘°ν μ μμ§λ§, let
, const
ν€μλλ‘ λ§λ λ³μλ μ μΈλ¬Έμ λλ¬νκΈ° μ μ λ³μλ₯Ό μ°Έμ‘°ν μ μλ€.
ν¨μ νΈμ΄μ€ν μ "ν¨μ μ μΈλ¬Έ" λ°©μμΌλ‘ μ μν ν¨μμ "ν¨μ ννμ" λ°©μμΌλ‘ μ μν ν¨μκ° λ€λ₯΄κ² μΌμ΄λλλ°, λ¨Όμ λ³μμ ν¨μλ₯Ό λ΄μμ ν¨μλ₯Ό μ μΈνλ ν¨μ ννμμ νΈμ΄μ€ν μ μμμ μ΄ν΄λ³Έ λ³μ νΈμ΄μ€ν κ³Ό λκ°μ΄ λ°μνλ€.
ν¨μ μ μΈλ¬ΈμΌλ‘ μ μΈν ν¨μλ ν¨μ μ μ²΄κ° νΈμ΄μ€ν λκΈ° λλ¬Έμ λ°νμμ μ€ν νλ¦μ΄ ν¨μμ μ μΈμ μ΄μ μλ ν¨μλ₯Ό μ°Έμ‘°ν μ μλ€. κ·Έλ¬λ μ΄λ λ§μ νΌλμ λ°μμν¬ μ μκΈ° λλ¬Έμ ν¨μ ννμ λ°©μμΌλ‘ ν¨μλ₯Ό μ μΈνλ κ²μ΄ μ’λ€.
ν¨μ μ μΈλ¬Έ λ°©μμ λ°νμ μ΄μ , ν¨μ μ μκ° νκ°λλ μμ μ ν¨μ κ°μ²΄κ° μμ±λλ€.
ν¨μ ννμ λ°©μμ λ°νμ λμ€, λ³μμ ν¨μ μ μκ° νκ°λμ΄ ν λΉλλ μμ μ ν¨μ κ°μ²΄κ° μμ±λλ€.
μλ°μ€ν¬λ¦½νΈμ μ€μ½νμμ μ΄ν΄λ΄€λ―μ΄ μ€μ½ν 체μΈμ νμ μ€μ½νμμ μμ μ€μ½νλ‘ λ¨λ°©ν₯μΌλ‘λ§ μ΄λν μ μλ€κ³ νλ€. OuterEnvironmentReference
λ₯Ό ν΅ν΄ λ¨λ°©ν₯ μ°κ²°λ¦¬μ€νΈλ‘ ꡬνλ μ€μ½ν 체μΈμ μμμ½λλ‘ μ΄ν΄λ³΄λ©΄μ λ³μ μλνμ λν΄μλ μ΄ν΄λ³΄μ.
let name = 'Harry';
function inner() {
let name = 'Hyeok';
console.log(name);
}
inner();
console.log(name);
μ μ μ½λ νκ°
νκ° μ΄μ μ μ μ κ°μ²΄κ° μμ±λκ³ , μ΄ν μ μ μ€ν 컨ν
μ€νΈκ° μμ±λλ€. 첫 μ€μμ λ³μ μ μΈλ¬Έμ λ§λ LexicalEnvironment
μ EnvironmentRecord
μ DeclarativeEnvironmentRecord
μ name
μ΄ λ±λ‘λλ€. μ΄ν ν¨μ μ μΈλ¬Έμ λ§λ ObjectEnvironmentRecord
μ inner
ν¨μ μμ²΄κ° λ±λ‘λλ€. μ΄ν OuterEnvironmentReference
μ μμ μ€μ½νλ₯Ό κ°λ¦¬μΌμΌ νλ, μ μ μ½λμ μμ μ€μ½νλ μμΌλ―λ‘ nullμ΄ ν λΉλλ€. (this λ°μΈλ© κ³Όμ μ μλ΅νλ€.)
μ μ μ½λ μ€ν
μ μ μ€ν 컨ν
μ€νΈκ° μ½ μ€νμ μμ΄λ©΄ μ μ μ½λκ° μ€νλλ€. 첫 μ€μμ name
μ Harry
κ° ν λΉλκ³ , inner()
λ₯Ό λ§λλ©΄ inner
μ½λλ₯Ό νκ°νλ€.
inner μ½λ νκ°
첫 μ€μμ λ³μ μ μΈλ¬Έμ λ§λ LexicalEnvironment
μ EnvironmentRecord
μ name
μ΄ λ±λ‘λλ€. OuterEnvironmentReference
μ μμ μ€μ½νμΈ μ μ μ€ν 컨ν
μ€νΈμ LexicalEnvironment
λ₯Ό ν λΉνλ€. (μμ this λ°μΈλ© κ³Όμ μ μλ΅νλ€.)
inner μ½λ μ€ν
inner
μ€ν 컨ν
μ€νΈκ° μ½ μ€νμ μμ΄λ©΄ μ μ μ½λμ μ€νμ΄ μ€μ§λκ³ inner
μ½λκ° μ€νλλ€. 첫 μ€μμ νμ¬ μ€ν 컨ν
μ€νΈμ LexicalEnvironment
μ EnvironmentRecord
μ λ±λ‘λ name
μ Hyeok
μ΄ ν λΉλκ³ console.log(name)μμ name
μ΄ νμ¬ μ€ν 컨ν
μ€νΈμ LexicalEnvironment
μμ λ±λ‘λμ΄ μλμ§ μ°Ύλλ€. μ§κΈμ λ±λ‘λμ΄μκΈ° λλ¬Έμ name
μ κ°μΈ Hyeok
μ μΆλ ₯νλ€.
μΌλ¨ μ¬κΈ°κΉμ§λ§ μμ보λλ‘ νκ² λ€. innerμ console.log(name)μμ Hyeok
μ΄ μΆλ ₯λλ μ΄μ λ inner ν¨μ μ€ν 컨ν
μ€νΈμμ name
μ΄ λ°κ²¬λμκΈ° λλ¬ΈμΈλ° μ΄λ‘ μΈν΄ μ μμμ μ μΈν λμΌν μ΄λ¦μ name
λ³μμλ μ κ·Όν μκ° μμλ€.
μ΄λ₯Ό λ³μ μλν(variable shadowing)μ΄λΌκ³ νλ€.
EnvironmentRecord
μ μλ³μ λ±λ‘κ³Όμ μμ νΈμ΄μ€ν
μ΄ λ°μνλ€.OuterEnvironmentReference
μ μ€μ½ν μ²΄μΈ κ΅¬νλ°©μμΌλ‘ μΈν΄ λ³μ μλνκ° λ°μνλ€.μ½μ΄ μλ°μ€ν¬λ¦½νΈ
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
μ°ν μ½ νλ‘ νΈμλJS λ 벨1 - 2022
good