μ΄ λΈλ‘κ·Έ μ½ν μΈ μλ μ± 'μ½μ΄ μλ°μ€ν¬λ¦½νΈ'λ₯Ό μ½κ³ μλ°μ€ν¬λ¦½νΈλ₯Ό κΉκ² μ΄ν΄νλ λ΄μ©μ΄ λ΄κΉλλ€.
μλ°μ€ν¬λ¦½νΈ μ€ν 컨ν μ€νΈ
μ€ν 컨ν μ€νΈλ μ€νν μ½λμ μ 곡ν νκ²½ μ 보λ₯Ό λͺ¨μλμ κ°μ²΄λ€. μ΄λ€ μ€ν 컨ν μ€νΈκ° νμ±νλλ μμ μ μ΄λ€ λ³μκ° λμ΄μ¬λ €μ§κ³ , μΈλΆ νκ²½ μ 보λ₯Ό μ€μ νκ³ , this κ°μ μ€μ νλ λ±μ λμμ μννλ€.
λμΌ νκ²½μ μλ μ½λλ₯Ό μ€νν λ νμν νκ²½ μ 보λ₯Ό λͺ¨λ λͺ¨μ 컨ν μ€νΈλ‘ ꡬμ±νκ³ , μ΄λ₯Ό μ½ μ€νμ μμμ¬λ¦°λ€. μ¬κΈ°μ μ€νμ μλ£κ΅¬μ‘°μ 'κ·Έ' μ€νμ΄ λ§λ€. κ°μ₯ μμ μμ 컨νμ€νΈμ κ΄λ ¨μλ μ½λλ₯Ό μ€ννλ μμΌλ‘ μ 체 μ½λμ νκ²½κ³Ό μμλ₯Ό μ νλ€.
νλμ λμΌν νκ²½, νλμ μ€ν 컨ν μ€νΈλ₯Ό ꡬμ±ν μ μλ λ°©λ²μ λ€μνκ² μλ€. μ μ곡κ°μμμ μμ , eval() ν¨μμ νμ©, κ°μ₯ νν λ°©λ²μ ν¨μλ₯Ό μ€ννλ κ²μ΄λ€.
μ€ν 컨ν μ€νΈ μ€νμ κΈ°λ³Έ λμ
// -- (1)
var a = 1;
function outer() {
function inner() {
console.log(a); // undefined
var a = 3;
}
inner(); // -- (2)
console.log(a); // 1
}
outer(); // -- (3)
console.log(a); // 1
μμ μ½λμμ (1)μ νκ²½μ μ μ 컨ν μ€νΈλ€. μ½λκ° μ½νλ μκ° κ°μ₯ λ¨Όμ μ½ μ€νμ λ΄κΈ΄λ€. μ μ 컨ν μ€νΈλ λ³λμ μ€ν λͺ λ Ή μμ΄λ λΈλΌμ°μ μμ μλμΌλ‘ μ€ννλ 컨ν μ€νΈλ€. λ§ κ·Έλλ‘ νμΌμ΄ λΈλΌμ°μ μμ μ΄λ¦¬λ μκ° μ μμ΄ νΌμ³μ§λ κ²μ΄λ€.
μ μμ μΌλ‘ μ½λλ€μ λ΄λ€κ°, (3)μμ ν¨μ νΈμΆμ λ§λλ©΄ outer ν¨μμ λν νκ²½ μ 보λ€μ 컨ν μ€νΈλ‘ μμ±νμ¬ μ½ μ€νμ λ΄λλ€. outer() ν¨μμ μ€ν 컨ν μ€νΈλ₯Ό μ½ μ€νμ λ΄λ κ²μ΄λ€. μ΄μ μ μμμ μννλ κ²μ λ©μΆκ³ outer ν¨μ λ΄λΆμ μ½λλ€μ μμ°¨μ μΌλ‘ μ€νμν¨λ€.
outer() ν¨μ λ΄λΆμμ inner() ν¨μλ₯Ό νΈμΆνλ (2)λ² νκ²½μ΄ μκΈ° λλ¬Έμ μ½ μ€νμ ν΄λΉ inner ν¨μμ νκ²½μ μ€ν 컨ν μ€νΈλ‘ λ΄λλ€. μ€νμ νΉμ±μ κ°μ₯ λ€μ λ€μ΄μ¨ μμλ₯Ό κ°μ₯ λ¨Όμ μ²λ¦¬ν΄μΌνκΈ° λλ¬Έμ innerκ° μ²λ¦¬λκ³ , outer, λ€μ μ μ μμλ‘ μ§ννλ€.
νλμ μ€ν 컨ν μ€νΈκ° μ½ μ€νμ κ°μ₯ μμ μμ΄λ μκ°μ΄ 곧 νμ¬ μ€νν μ½λμ κ΄μ¬νκ² λλ μμ μ΄λ€. μλ‘μ΄ μ€νμΌλ‘ νΉμ 컨ν μ€νΈκ° νμ±νλλ©΄ ν΄λΉ μ½λλ₯Ό μ€ννλ κ²μ νμν νκ²½ μ 보λ₯Ό μμ§ν κ°μ²΄κ° μ€ν 컨ν μ€νΈμ μ μ₯λλ λ°©μμ΄ μλ°μ€ν¬λ¦½νΈμ λμ λ°©μμ΄λ€.
μ€ν 컨ν μ€νΈ κ°μ²΄ μ리먼νΈ
μ€ν 컨ν μ€νΈ κ°μ²΄λ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ½λλ₯Ό λ리λ λͺ©μ μΌλ‘ μμ±λκΈ° λλ¬Έμ μ°λ¦¬κ° μ½λλ₯Ό ν΅ν΄μ μ§μ νμΈνκΈ°λ νλ€λ€.
Variable Environment (λ³μ νκ²½)
νμ¬ μ»¨νμ€νΈκ° κ°μ§κ³ μλ μλ³μμ λν μ 보, μΈλΆ νκ²½ μ 보, μ μΈ μμ μ Lexical νκ²½μ μ€λ μ·μ κ°μ§λ νκ²½μ΄λ€. ν΄λΉ 컨ν μ€νΈκ° μ΅μ΄λ‘ μ€νλ λμ μ€λ μ·μ μ μ§νλ€. μ΄ μ€λ μ·μ κ·Έλλ‘ λ³΅μ¬ν΄μ Lexical νκ²½μ λ§λ λ€. μ€ν΅ 컨ν μ€νΈμ ν νλ¦Ώμ λ§λλ 격μ΄λΌκ³ μκ°νλ©΄ νΈνκ² λ€.
Lexical Environment (μ¬μ μ νκ²½)
μ²μ μ μΈλ λμλ Variable νκ²½κ³Ό λμΌνμ§λ§ λ³κ²½μ¬νμ΄ μκΈ°λ©΄ μ€μκ°μΌλ‘ λ°μλλ νκ²½μ΄λ€. "νμ¬ μ»¨ν μ€νΈμλ μ΄λ€ μ΄λ€ μλ³μλ€μ΄ μκ³ , μΈλΆ νκ²½μ λν μ 보λ νΉμ μ΄λ€ μ£Όμλ₯Ό μ°Έμ‘°νλλ‘ λμ΄μλ€." μ΄λ° νμμΌλ‘ μ¬μ μ²λΌ μ μλ νκ²½μ΄λ€.
environmentRecord
environmentRecordμλ νμ¬ μ»¨ν μ€νΈμ κ΄λ ¨λ μ½λ μλ³μ μ λ³΄κ° μ μ₯λλ€. ν¨μμ 맀κ°λ³μ μ΄λ¦, ν¨μ κ·Έ μ체, μ μΈλ λ³μκ° μ»¨ν μ€νΈμ μλ³μκ° λλ€. μ½λ μμμ μλλ‘ νμΌλ©° μμλλ‘ μμ§νλ€.
μμ§λ μλ³μλ€μ νΈμ΄μ€ν μ ν΅ν΄μ, μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ€μ§μ μΌλ‘ μλ³μλ€μ μ€νμ κ°μ₯ μλ¨μΌλ‘ λμ΄μ¬λ¦¬μ§λ μμ§λ§, μ½λ ν΄μμ μ΅μλ¨μΌλ‘ λμ΄μ¬λ €μ§λ€.
νΈμ΄μ€ν (hoisting = hoist + ing) κ·μΉ
- νΉμ μ€ν 컨ν μ€νΈμ λν΄μ λ³μλ μ μΈλ§ λμ΄μ¬λ¦°λ€. ν λΉμ λμ΄μ¬λ¦¬μ§ μλλ€. 맀κ°λ³μλ‘ λ€μ΄μ€λ κ°λ λμΌνλ€.
- ν¨μμ λν μ μΈμ ν¨μ μ 체λ₯Ό λμ΄μ¬λ¦°λ€. λμΌ λ³μλͺ μΌλ‘ ν¨μλ₯Ό μ μΈνλ©΄ ν΄λΉ λ³μλͺ μ μ£Όμκ°μ ν¨μλ§ λ΄κ²¨ λμ΄μ¬λ €μ§λ€κ³ μκ°νμ. λ€λ§, ννμμΌλ‘ μμ±λ ν¨μλ λμ΄μ¬λ €μ§μ§ μλλ€. ν λΉμ κ°λ μ΄κΈ° λλ¬Έμ΄λ€.
ν¨μ μ μΈκ³Ό ννμ
ν¨μλ₯Ό μ μνλ λ°©λ²μ μλμ 3κ°μ§ λ°©μμ λ°λ₯Έλ€. μ μΈμμ κ²½μ° λ³΄ν΅ function ν€μλλ‘ μ μΈνλ λΆλΆλ§ μ‘΄μ¬νκ³ λ³λμ ν λΉ κ³Όμ μ΄ μλ€. ν¨μ μ μΈμμ κ²½μ°μλ λ°λμ ν¨μλͺ μ΄ μ μλμ΄μΌ νλ€.
μ΄μ λ°λλ‘ ν¨μ ννμμ μ μν ν¨μλ₯Ό λ³λ λ³μμ ν λΉνλ κ³Όμ μ체λ₯Ό μλ―Ένλ€. ννμμΌλ‘ μμ±λ ν¨μλ λ³λμ μ΄λ¦μ΄ κΌ μ‘΄μ¬νμ§λ μμλ λλ€. μ΅λͺ ν¨μλΌκ³ λ νλ€.
function a() {} // ν¨μ μ μΈμ
const b = function () {}; // ν¨μ ννμ -> function ν€μλ
const d = function e() {}; // μ΄λ¦μ΄ μλ ν¨μ ννμ -> μΈλΆμμ ν΄λΉ ν¨μλͺ
μΌλ‘ νΈμΆ λΆκ°
e(); // -> error
const c = () => {}; // ν¨μ ννμ -> arrow function
μ€μ½ν
μ€μ½νλ μλ³μ, λ³μκ° μ κ·Ό κ°λ₯ν μ ν¨λ²μλ€. ES6λΆν° μλ°μ€ν¬λ¦½νΈλ ν¨μ, λΈλ‘μ λν μ€μ½νκ° κ΅¬λΆλμλ€. μλ³μμ μ ν¨λ²μκ° μμμλΆν° λ°κΉ₯μΌλ‘ μμλλ‘ κ²μνλ 체μΈμ 'μ€μ½ν 체μΈ'μ΄λΌκ³ νλ€. μλ°μ€ν¬λ¦½νΈμμ μ€μ½νλ μ€κ΄νΈλ‘ ꡬλΆνλ€. λν ν¨μμ λ΄λΆμ μλ³μκ° μλμ§ μΈλΆμ μλμ§λ μ€μ½νλ₯Ό λ°μ§λ κ²μ ν° μν₯μ μ€λ€.
μ€μ½νμ κ·μΉμ μ 리νλ©΄ λ€μκ³Ό κ°λ€.
- λ΄λΆμ μλ μ€μ½νμμ μΈλΆμ μ€μ½νλ‘μ μ κ·Όμ κ°λ₯νλ€. μ¦, λ΄λΆ μ€μ½νμμ μΈλΆμ μ μλ λ³μλ₯Ό μ‘°νν μ μκ³ , μ¬μ©ν μ μλ€.
- μΈλΆ μ€μ½νμμλ λ΄λΆμ μ μλ μλ³μλ₯Ό μ‘°νν μ μλ€. μ΄κ²μ ν΅ν΄μ μ°λ¦¬λ λ³μμ μλνλ₯Ό ν μ μλ€.
- μ€μ½νλ μ€μ²©μ΄ κ°λ₯νλ€. μ€μ²©λ κ°μ₯ μΈλΆμ μ€μ½νλ₯Ό μ μ(global), κ·Έκ²μ΄ μλ μ€μ½νλ λͺ¨λ μ§μ(local) μ€μ½νλ€.
- μ§μ μ€μ½ν λ΄μμ μ μΈλ μλ³μ, λ³μκ° Lexical νκ²½μμ μ‘°νλκΈ° λλ¬Έμ μ°μ μμλ₯Ό κ°μ§λ€. Lexicalν νκ²½μμ μ μΈλ μλ³μκ° μλ€λ©΄ κ·Έ λ€μ μ€μ½νλ₯Ό λ€μ§κ³ λ λ€μ μ€μ½νλ₯Ό λ€μ§λ νμμΌλ‘ κ°λ κ²μ΄λ€.