μ€ν 컨ν μ€νΈ
μ€ν 컨ν μ€νΈλ₯Ό μλ©΄ νΈμ΄μ€ν κ³Ό ν΄λ‘μ , μ½λ μ€ν μμλ₯Ό μ΄ν΄νλλ° λμμ΄ λκΈ° λλ¬Έμ μ 리ν©λλ€.
μμ€ μ½λμ νμ
- μ μ μ½λ
μ μ λ³μλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ΅μμ μ€μ½νμΈ μ μ μ€μ½νλ₯Ό μμ±νλ€.
- ν¨μ μ½λ
μ§μ μ€μ½νλ₯Ό μμ±νκ³ μ§μλ³μ, λ§€κ°λ³μ, argumentsκ°μ²΄λ₯Ό κ΄λ¦¬νλ€.
- eval μ½λ
μ격 λͺ¨λμμ μμ λ§μ λ μμ μΈ μ€μ½νλ₯Ό μμ±νλ€.
- λͺ¨λ μ½λ
λͺ¨λλ³λ‘ λ 립μ μΈ λͺ¨λ μ€μ½νλ₯Ό μμ±νλ€.
μμ€μ½λ(μ μ, ν¨μ, eval, λͺ¨λ) → μ½λ νκ° → μ€ν 컨ν μ€νΈ(μ μ, ν¨μ, eval, λͺ¨λ)
μμ€ μ½λμ νκ°μ μ€ν
μλ° μ€ν¬λ¦½νΈ μμ§μ μμ€μ½λλ₯Ό 2κ°μ κ³Όμ μΌλ‘ λλμ΄ μ²λ¦¬νλ€ ( μμ€μ½λ νκ°, μμ€μ½λ μ€ν )
- μμ€ μ½λ νκ°
μ€ν 컨ν μ€νΈ μμ±νκ³ λ³μ, ν¨μ λ±μ μ μΈλ¬Έλ§ λ¨Όμ μ€ννμ¬ μ€μ½νμ λ±λ‘νλ€.
- μμ€ μ½λμ μ€ν ( λ°νμ )
μμ€ μ½λκ° μμ°¨μ μΌλ‘ μ€νλλ©°, μ΄λ νμν μ 보λ μ€ν 컨ν μ€νΈκ° κ΄λ¦¬νλ μ€μ½νμμ κ²μν΄μ μ·¨λνλ€.
μ€ν μ΄ν κ²°κ³Όλ λ€μ μ€ν 컨ν μ€νΈκ° κ΄λ¦¬νλ μ€μ½νμ λ±λ‘νλ€.
μμ€μ½λμ νκ° → μ€ν 컨ν μ€νΈ μμ± → μμ€μ½λμ μ€ν → μ€ν 컨ν μ€νΈμ μ€μ½νμ λ±λ‘
var x
x = 1
μ€ν 컨ν μ€νΈ | |
x | undefined |
↓
μ€ν 컨ν μ€νΈ | |
x | 1 |
μ€ν
μ€ν 컨ν μ€νΈμ μν λ° μ€ν
μμ€μ½λλ₯Ό μ€ννλλ° νμν νκ²½μ μ 곡νκ³ μ½λμ μ€ν κ²°κ³Όλ₯Ό μ€μ λ‘ κ΄λ¦¬νλ€.
μλ³μλ₯Ό λ±λ‘νκ³ κ΄λ¦¬νλ μ€μ½νμ μ½λ μ€ν μμ κ΄λ¦¬λ₯Ό ꡬνν λ΄λΆ λ©μ»€λμ¦μΌλ‘,
λͺ¨λ μ½λλ μ€ν 컨ν μ€νΈλ₯Ό ν΅ν΄ μ€νλκ³ κ΄λ¦¬λλ€.
μλ³μμ μ€μ½νλ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½μΌλ‘ κ΄λ¦¬νλ€.
μ½λ μ€ν μμλ μ€ν 컨ν μ€νΈ μ€νμΌλ‘ κ΄λ¦¬νλ€.
+ μ΅μμμ μ‘΄μ¬νλ μ€ν 컨ν μ€νΈλ₯Ό μ€ν μ€μΈ μ€ν 컨ν μ€νΈλΌκ³ νλ€.
const x = 1
function foo(a){
const x = 10
const y = 20
console.log(a + y)
}
foo(100)
console.log(x)
μμ μ½λμ μ€ν 컨ν μ€νΈ μμλ₯Ό μλ‘ λ€λ©΄
1. μ μ μ½λ νκ° (μ μ μ€ν 컨ν μ€νΈλ₯Ό μμ±νκ³ μ€ν 컨ν μ€νΈ μ€νμ νΈμ)
μ μ λ³μμ μ μ ν¨μκ° μ μ μ€μ½νμ λ±λ‘λλ€.
μ΄λ, varλ‘ μ μΈν μ μ λ³μμ functionμΌλ‘ μ μΈλ ν¨μλ μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλκ° λλ€.
2. μ μ μ½λ μ€ν ( foo ν¨μκ° νΈμΆλλ©΄μ μ€ν 컨ν μ€νΈ μ€νμ foo ν¨μ μ€ν 컨ν μ€νΈ νΈμ)
λ°νμμ΄ μμλμ΄ μ½λκ° μμ°¨μ μΌλ‘ νκ°λλ€.
μ°¨λ‘λλ‘ μ μ λ³μμ κ°μ΄ ν λΉλκ³ ν¨μκ° νΈμΆλλ€. ( ν¨μκ° νΈμΆλλ©΄ ν¨μ λ΄λΆλ‘ μ΄λνλ€)
3. ν¨μ μ½λ νκ°
μ΄κ²λ μμ κ³Όμ κ³Ό λκ°μ΄ μ°μ νκ°λ₯Ό λ¨Όμ νλ€. ( λ§€κ°λ³μ, μ§μλ³μ μ μΈ λ° μ§μ μ€μ½νμ λ±λ‘)
4. ν¨μ μ½λ μ€ν ( foo ν¨μκ° μ€ν μ’ λ£λλ©° μ€ν 컨ν μ€νΈ μ€νμμ pop νλ€)
λ°νμμ΄ μμλμ΄ ν¨μ μ½λκ° μμ°¨μ μΌλ‘ μ€νλλ€.
μ΄λ μλ³μλ€μ κ°μ΄ ν λΉλκ³ , μ€μ½ν 체μΈμ ν΅ν΄ μλ³μλ₯Ό μ°Ύμ κ°μ μΆλ ₯νλ€.
5. μ μ μ½λ μ΄μ΄μ μ€ν
λ§μ§λ§μΌλ‘ console.log(x)κ° μ€νλκ³ λμ μ€ν 컨ν μ€νΈμμ μ μ μ€ν 컨ν μ€νΈλ₯Ό pop νλ€.
λ μ컬 νκ²½
μλ³μμ μλ³μμ λ°μΈλ©λ κ°, κ·Έλ¦¬κ³ μμ μ€μ½νμ λν μ°Έμ‘°λ₯Ό κΈ°λ‘νλ μλ£κ΅¬μ‘°λ‘ μ€ν 컨ν μ€νΈλ₯Ό ꡬμ±νλ μ»΄ν¬λνΈλ€.
( ν€μ κ°μ κ°λ κ°μ²΄ ννμ μ€μ½νλ₯Ό μμ±νλ€.)
λ μ컬 νκ²½μ λ κ°μ μ»΄ν¬λνΈλ‘ ꡬμ±λλ€.
1. νκ²½ λ μ½λ (Environment Record)
μ€μ½νμ ν¬ν¨λ μλ³μ λ±λ‘ λ° μλ³μμ λ°μΈλ©λ κ°μ κ΄λ¦¬νλ μ μ₯μ
2. μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° (Outer Lexical Environment Reference)
μμ μ€μ½νλ₯Ό κ°λ¦¬ν¨λ€.
μ€ν 컨ν μ€νΈμ μμ±κ³Ό μλ³μ κ²μ κ³Όμ
var x = 1
const y = 2
function foo (a) {
var x = 3
const y = 4
function bar(b) {
const z = 5
console.log(a + b + x + y + z)
}
bar(10)
}
foo(20)
μμ μ½λλ₯Ό μμλ‘ μ 체 μ€ν 컨ν μ€νΈμ μμ±κ³Ό μλ³μ κ²μ κ³Όμ μ μ΄ν΄λ³΄κ² μ΅λλ€.
1. μ μ κ°μ²΄ μμ±
μ μ μ½λ νκ°μ μ μ κ°μ²΄κ° λ¨Όμ μμ±λλ€.
2. μ μ μ½λ νκ°
μ μ μ½λ νκ³Ό κ³Όμ μ λ€μκ³Ό κ°λ€.
- μ μ μ€ν 컨ν μ€νΈ μμ± ( μ€ν 컨ν μ€νΈ μ€νμ push )
- μ μ λ μ컬 νκ²½ μμ± ( μ μ λ μ컬 νκ²½μ μμ±νκ³ μ μ μ€ν 컨ν
μ€νΈμ λ°μΈλ©, λ μ컬 νκ²½μ νκ²½ λ μ½λμ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° 2κ°μ§λ‘ ꡬμ±λλ€.)
- μ μ νκ²½ λ μ½λ μμ± ( κ°μ²΄ νκ²½ λ μ½λμ μ μΈμ νκ²½ λ μ½λλ‘ κ΅¬μ±λλ€.)
- κ°μ²΄ νκ²½ λ μ½λ μμ± ( var ν€μλλ‘ μ μΈλ μ μ λ³μ λ° ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μ μ ν¨μ λ±λ‘)
- μ μΈμ νκ²½ λ μ½λ μμ± ( let, const ν€μλλ‘ μ μΈλ μ μ λ³μ λ±λ‘)
- μ μ νκ²½ λ μ½λ μμ± ( κ°μ²΄ νκ²½ λ μ½λμ μ μΈμ νκ²½ λ μ½λλ‘ κ΅¬μ±λλ€.)
- this λ°μΈλ© ( ν¨μμ νΈμΆ λ°©μμ λ°λΌ λ€λ₯΄λ€)
- μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° κ²°μ ( μμ μ€μ½ν )
- κ°μ²΄ νκ²½ λ μ½λ ( Object Environment Record)
var ν€μλλ‘ μ μΈν μ μ λ³μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν μ μ ν¨μ, λΉνΈμΈ μ μ νλ‘νΌν°μ λΉνΈμΈ μ μ ν¨μ, νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό κ΄λ¦¬νλ€.
- BindingObject
μ μ κ°μ²΄
- μ μΈμ λ μ½λ (Declarative Environment Record)
let, const ν€μλλ‘ μ μΈν μ μ λ³μλ₯Ό κ΄λ¦¬νλ€.
3. μ μ μ½λ μ€ν
4. foo ν¨μ μ½λ νκ° ( μ μ μ½λ νκ³Ό κ³Όμ κ³Ό λμΌ , μ€νμ foo μ€ν 컨ν μ€νΈ μΆκ° )
- ν¨μ μ€ν 컨ν μ€νΈ μμ±
- ν¨μ λ μ컬 νκ²½ μμ±
- ν¨μ νκ²½ λ μ½λ μμ± ( λ§€κ°λ³μ, arguments κ°μ²΄, ν¨μ λ΄λΆμ μ§μ λ³μμ μ€μ²© ν¨μ λ±λ‘ )
- this λ°μΈλ©
- μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° κ²°μ
5. foo ν¨μ μ½λ μ€ν
6. bar ν¨μ μ½λ νκ° ( foo ν¨μ μ½λ νκ° κ³Όμ κ³Ό λμΌ , μ€ν 컨ν μ€νΈ μ€νμ bar μ€ν 컨ν μ€νΈ μΆκ° )
7. bar ν¨μ μ½λ μ€ν
9. bar ν¨μ μ½λ μ€ν μ’ λ£ ( μ€νμμ bar μ€ν 컨ν μ€νΈ μ κ±° )
10. foo ν¨μ μ½λ μ€ν μ’ λ£ ( μ€νμμ foo μ€ν 컨ν μ€νΈ μ κ±° )
11. μ μ μ½λ μ€ν μ’ λ£ ( μ€νμμ μ μ μ€ν 컨ν μ€νΈ μ κ±° )
νΈμ΄μ€ν
μμμ μ 리ν μ€ν 컨ν μ€νΈλ‘ νΈμ΄μ€ν λ₯Ό μ€λͺ νκ² μ΅λλ€.
- νΈμ΄μ€ν
νΈμ΄μ€ν μ΄λ μ μΈλ¬Έμ΄ λ°νμ μ μ μ€μ½ν μ΅μλ¨μΌλ‘ λμ΄μ¬λ €μ§λ κ²μ λ§νλ€.
μ΄λ var ν€μλμ let, const ν€μλλ‘ μ μΈν λ³μλ€μ νΈμΆ μμ μ λ°λ₯Έ κ°μ΄ λ€λ₯Έλ°
μ΄κ²μ μ€ν 컨ν μ€νΈ λ¨κ³λ³λ‘ μ΄ν΄λ³΄λ©° μ΄μ λ₯Ό μμλ³΄κ² μ΅λλ€.
console.log(x) // undefined
var x = 1
console.log(x)
console.log(y) // μ°Έμ‘° μλ¬
let y = 1
console.log(y) // 1
1. μ μ μ½λ νκ°
var ν€μλλ‘ μ μΈλ xλ νκ° κ³Όμ μμ μ μΈκ³Ό μ΄κΈ°νλ₯Ό κ°μ΄ μ§νν©λλ€ (undefined)
let ν€μλλ‘ μ μΈλ yλ νκ° κ³Όμ μμ μ μΈλ§ μ§νν©λλ€.
μ μ μ€ν 컨ν μ€νΈ | |
x | undefined |
y |
2. μ μ μ½λ μ€ν
λ°νμμ΄ μμλμ΄ μ μ μ½λκ° μμ°¨μ μΌλ‘ μ€νλ©λλ€.
1. console.log(x) μ€ν, μ΄λ νμ νκ²½ λ μ½λμμ μλ³μ xλ₯Ό μ°Ύκ³ undefinedλ₯Ό μΆλ ₯νλ€.
2. xμ κ°μ 1μ ν λΉνλ€.
3. console.log(x) μ€ν, νμ¬ νκ²½ λ μ½λμμ μλ³μ xλ₯Ό μ°Ύκ³ 1μ μΆλ ₯νλ€.
4. console.log(y) μ€ν, νμ¬ νκ²½ λ μ½λμμ μλ³μ yλ₯Ό μ°Ύμ§λ§ κ°μ΄ μκΈ° λλ¬Έμ μ°Έμ‘° μλ¬ λ°μνλ€.
5. yμ κ°μ 1μ ν λΉνλ€.
6. console.log(y) μ€ν, νμ¬ νκ²½ λ μ½λμμ μλ³μ yλ₯Ό μ°Ύκ³ 1μ μΆλ ₯νλ€.
μμ κ³Όμ μ ν΅ν΄ TDZκ° λ°μνλ μ΄μ μ, var ν€μλλ‘ λ³μ μ μΈ μ λ³μ μ μΈ μ νΈμΆμ΄ λλ μ΄μ λ₯Ό μ μ μμ΅λλ€.
'π Study Note > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive - λΉλκΈ° νλ‘κ·Έλλ° (0) | 2022.12.31 |
---|---|
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive - this (0) | 2022.12.25 |
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive - κ°μ²΄ 리ν°λ΄ (1) | 2022.12.25 |
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive - νΈμ΄μ€ν , var, let, const (0) | 2022.12.09 |
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive - μ€μ½ν (0) | 2022.12.08 |