9-1. νΈμ΄μ€ν
μ΄λ?9-1-1. μ μμ κ°λ
9-1-2. νΈμ΄μ€ν
μ΄ λ°μνλ μ΄μ 9-2. λ³μ νΈμ΄μ€ν
9-2-1. var ν€μλμ νΈμ΄μ€ν
9-2-2. letκ³Ό const ν€μλμ νΈμ΄μ€ν
9-3. ν¨μ νΈμ΄μ€ν
9-3-1. ν¨μ μ μΈμκ³Ό ν¨μ ννμμ μ°¨μ΄9-3-2. ν¨μ μ μΈμμ νΈμ΄μ€ν
9-3-3. ν¨μ ννμμ νΈμ΄μ€ν
9-4. ν΄λμ€μ νΈμ΄μ€ν
9-4-1. ν΄λμ€μ νΈμ΄μ€ν
9-1. νΈμ΄μ€ν μ΄λ?
9-1-1. μ μμ κ°λ
ν¨μ μμ μλ μ μΈλ€μ λͺ¨λ λμ΄μ¬λ €μ ν΄λΉ ν¨μ μ ν¨ λ²μ(scope)μ μ΅μλ¨μ μ μΈνλ κ² κ°μ΄ λμνλ νμμ λ§νλ€. μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μ€ννκΈ° μ μ€ν κ°λ₯ν μ½λλ₯Ό νμννκ³ κ΅¬λΆνλ κ³Όμ (μ€ν컨ν
μ€νΈλ₯Ό μν κ³Όμ )μ κ±°μΉλ€. μ€ν 컨ν
μ€νΈλ₯Ό μν κ³Όμ μμ λͺ¨λ μ μΈ(var, let, const, function, class)μ μ€μ½νμ λ±λ‘νλ€. μ½λ μ€ν μ μ΄λ―Έ λ³μ(var)μ ν¨μμ μΈμ΄ μ μ₯λμ΄ μκΈ° λλ¬Έμ μ°Έμ‘°/νΈμΆμ΄ λ¨Όμ λμλ μ€λ₯ μμ΄ λμνλ€.
νΈμ΄μ€ν
μ΄λΌλ μ©μ΄λ₯Ό μλ°μ€ν¬λ¦½νΈ μ€ν 컨ν
μ€νΈμ μν μμ μ€λͺ
ν νμμ νΈμ΄μ€ν
μ΄λΌκ³ λΆλ₯Έλ€λ κ²μΌλ‘ μ΄ν΄νλ©΄ λκ² λ€. κ·Έ νμμ΄λ μ μΈμ΄ μ½λ μ€νλ³΄λ€ λ¨Όμ λ©λͺ¨λ¦¬μ μ μ₯λλ κ³Όμ μΌλ‘ μΈν νμμ λ§νλ€.
9-1-2. νΈμ΄μ€ν μ΄ λ°μνλ μ΄μ
var a = 2; λ νλμ ꡬ문μ²λΌ 보μ΄μ§λ§, μλ°μ€ν¬λ¦½νΈ μμ§μ κ·Έλ κ² λ³΄μ§ μλλ€. 'var a'μ βa = 2'λΌλ λ³κ°μ ꡬ문μΌλ‘ λ³΄κ³ , 첫 λ²μ§Έλ μ»΄νμΌλ¬ λ¨κ³μμ μ²λ¦¬νκ³ , λ λ²μ§Έ ꡬ문μ μ€ν λ¨κ³μμ μ²λ¦¬νλ€.
μ΄ μλ―Έλ μ€μ½νμ λͺ¨λ μ μΈλ¬Έμ μ€ν μ μ λ¨Όμ μ²λ¦¬λλ€λ μ μ΄λ€.
νΈμ΄μ€ν
μ΄ λ°μνλ μ΄μ μ λν΄ λ μμΈν μμ보μ.
μ€ν 컨ν
μ€νΈμ λ μ컬 νκ²½(Lexical Environment)μ νκ²½ λ μ½λ(Environment Record)μ μΈλΆ λ μ컬 νκ²½ μ°Έμ‘° μ»΄ν¬λνΈ(Outer LexicalEnvironment Reference)λ‘ κ΅¬μ±λλ€.
Environment Record λ μ ν¨ λ²μ μμ μλ³μμ κ²°κ³Όκ°μ λ°μΈλ ν΄μ κΈ°λ‘νλ μμμ΄λ€. μ¬κΈ°μ ν¨μ μ μΈ, λ³μλͺ
λ±μ΄ λ΄κΈ°λλ°, 컨ν
μ€νΈ λ΄λΆ μ 체λ₯Ό μ²μλΆν° λκΉμ§ νμΌλ©΄μ μμλλ‘ μμ§νλ€. λ°λΌμ μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λκ° μ€νλκΈ° μ μλ μ΄λ―Έ ν΄λΉ νκ²½μ μν μ½λ λ³μλͺ
λ€μ μκ³ μκΈ° λλ¬Έμ νΈμ΄μ€ν
μ΄ μΌμ΄λλ κ²μ΄λ€.
9-2. λ³μ νΈμ΄μ€ν
9-2-1. var ν€μλμ νΈμ΄μ€ν
λ³μ(var)μ μΈμ΄ νΈμ΄μ€ν
μΌλ‘ μΈν΄ μ μΈμ΄ λμ΄μ¬λ €μ Έμ μ€λ₯κ° λμ§ μλλ€.
console.log(text); // μ μΈ, μ΄κΈ°ν ok text = 'Hanamon!'; // μ μΈ, μ΄κΈ°ν, ν λΉ ok var text;
9-2-2. letκ³Ό const ν€μλμ νΈμ΄μ€ν
μλ μ½λμμ νΈμ΄μ€ν
λλ¬Έμ μ μΈμ΄ λμ΄μ¬λ €μ‘μ§λ§, μ΄κΈ°ν μ λ μνμμ μ°Έμ‘°ν΄μ μ€λ₯κ° λλ€.
console.log(text); // μ μΈ ok / μ΄κΈ°ν x //(λ©λͺ¨λ¦¬ κ³΅κ° ν보μ undefinedλ‘ μ΄κΈ°ν) μ°Έμ‘° λΆκ°λ₯ -> μλ¬ λ°μ let text; // μ¬κΈ°μ μ΄κΈ°ν λ¨κ³κ° μ€νλλ€.
const text; // μ μ΄μ const ν€μλλ‘ μ¬ν λΉ λΆκ°λ₯! κ·Έλμ μ μΈκ³Ό λμμ ν λΉν΄μΌ ν¨
TDZ(Temporal Dead Zone)
TDZλ μΌμμ μΈ μ¬κ°μ§λλ‘, λ³μλ₯Ό μ¬μ©νλ κ²μ λΉνμ© νλ κ°λ
μμ 곡κ°μ΄λ€.
TDZμ μλ κ°μ μ κ·Όνκ² λλ©΄ ReferenceErrorκ° λ°μνλ€
μ ννλ const, letμ΄ νΈμ΄μ€ν
μ΄ λ°μνμ§ μλ κ²μ΄ μλλ€. μ μΈλ¬Έμ ν΅ν΄ λͺ¨λ μλ³μ(λ³μ, ν¨μ, ν΄λμ€ λ±)λ νΈμ΄μ€ν
λλ€.
κ·Έλ¬λ varκ³Ό λ€λ₯΄κ² μ΄κΈ°νλκΈ° μ κΉμ§ TDZμ λ¨Έλ¬Όλ¬μκΈ° λλ¬Έμ νΈμ΄μ€ν
μ΄ λ°μνμ§ μλ κ²μ²λΌ 보μ΄λ©° μ°Έμ‘°κ° λΆκ°λ₯νλ€.
9-3. ν¨μ νΈμ΄μ€ν
9-3-1. ν¨μ μ μΈμκ³Ό ν¨μ ννμμ μ°¨μ΄
ν¨μ μ μΈμμ ν¨μ μ΄λ¦κ³Ό ν¨κ» μ μΈλμ΄ νΈμ΄μ€ν
λλ©°, μ΄λμλ νΈμΆν μ μλ€. ν¨μ ννμμ λ³μμ ν λΉλ ν¨μλ‘, λ³μ νΈμ΄μ€ν
μ΄ λ°μνλ―λ‘ λ³μκ° μ μΈλκΈ° μ μλ νΈμΆν μ μλ€.
// ν¨μ ννμ function getName() { console.log('name'); } // ν¨μ μ μΈλ¬Έ var name = function() { console.log('name'); };
9-3-2. ν¨μ μ μΈμμ νΈμ΄μ€ν
ν¨μ μ μΈμμ μ μ²΄κ° νΈμ΄μ€ν
λκΈ° λλ¬Έμ ν¨μλ₯Ό μ μΈνκΈ° μ μλ νΈμΆν μ μλ€.
9-3-3. ν¨μ ννμμ νΈμ΄μ€ν
ν¨μ ννμμ λ³μκ° νΈμ΄μ€ν
λμ§λ§ ν¨μ μ체λ νΈμ΄μ€ν
λμ§ μμΌλ―λ‘ λ³μκ° μ μΈλκΈ° μ μ ν¨μλ₯Ό νΈμΆνλ©΄ μ€λ₯κ° λ°μνλ€.
count(); var count = function() { console.log('countλ 1μ΄λ€.'); }
μ μ½λλ count()νΈμΆ ν, var countλ₯Ό μ μΈνλ©° ν¨μλ₯Ό λ΄μλ€. varλ νΈμ΄μ€ν
μ μν₯μ λ°μΌλ―λ‘ μλ‘ λμ΄μ¬λ €μ§κ³ var count; κ° κ°μ₯ λ¨Όμ μ€νλλ€. κ·Έ νλ‘ count()κ° νΈμΆλλ©΄ μμ μ μΈν countκ° νΈμΆλλ―λ‘ λ³μλ₯Ό νΈμΆνλ κ²©μ΄ λλ€.
var count; // undefined count(); // countλ ν¨μκ° μλλ° μ ν¨μλ₯Ό νΈμΆνμ§? -> typeError var count = function() { console.log('countλ 1μ΄λ€.'); }
λ§μ½ varλμ let λλ constλ₯Ό μΌλ€λ©΄ Type Errorκ° μλ Reference Errorκ° λ°μν κ²μ΄λ€.(νΈμ΄μ€ν
μ μν₯μ λ°μ§ μκΈ° λλ¬Έμ΄λ€.)
9-4. ν΄λμ€μ νΈμ΄μ€ν
9-4-1. ν΄λμ€μ νΈμ΄μ€ν
ν΄λμ€λ varν€μλλ‘ μ μΈν λ³μμ²λΌ νΈμ΄μ€ν
λμ§ μκ³ let, constν€μλλ‘ μ μΈν λ³μμ²λΌ νΈμ΄μ€ν
λλ€. λ°λΌμ ν΄λμ€ μ μΈλ¬Έ μ΄μ μ μΌμμ μ¬κ°μ§λ(Temporal Dead Zone: TDZ)μ λΉ μ§κΈ° λλ¬Έμ νΈμ΄μ€ν
μ΄ λ°μνμ§ μλ κ²μ²λΌ λμνλ€
const Foo = ''; { // νΈμ΄μ€ν μ΄ λ°μνμ§ μλλ€λ©΄ ''κ° μΆλ ₯λμ΄μΌ νλ€. console.log(Foo); // ReferenceError: Cannot access 'Foo' before initialization class Foo {} }
μ 리νλ©΄ νΈμ΄μ€ν
μ var, let, const, function, classν€μλλ₯Ό μ¬μ©ν λͺ¨λ μ μΈλ¬Έμ μ μ©λλ€. λ€μ λ§ν΄, μ μΈλ¬Έμ ν΅ν΄ λͺ¨λ μλ³μ(λ³μ, ν¨μ, ν΄λμ€ λ±)λ νΈμ΄μ€ν
λλ€. λͺ¨λ μ μΈλ¬Έμ λ°νμ μ΄μ μ λ¨Όμ μ€νλκΈ° λλ¬Έμ΄λ€.