π‘ν΄λ‘μ λ
ν΄λ‘μ λ μ£Όλ³μ μν (lexical environment)μ μ°Έμ‘°μ ν¨κ» λ²λ€λ‘ λ¬ΆμΈ ν¨μμ μ‘°ν©μ λλ€. μ¦, ν΄λ‘μ Έλ μ°λ¦¬μκ² innerν¨μμμ outerν¨μμ μ€μ½νμ μ κ·Όμ κ°λ₯νκ² ν΄μ€λλ€. μλ°μ€ν¬λ¦½νΈμμ ν΄λ‘μ λ ν¨μκ° μμ±λ λλ§λ€ μμ±λ©λλ€.
μλλ ν΄λ‘μ λ₯Ό μ€λͺ νλ μ¬λ¬ λ¬Έμμμ μ°Έκ³ ν κ²μ΄λ€.
ν¨μμ ν¨μκ° μ μΈλ μ΄νμ (lexical) νκ²½μ μ‘°ν©
- ν΄λ‘μ λ ν¨μλ₯Ό μ§μΉνκ³ λ κ·Έ ν¨μκ° μ μΈλ νκ²½κ³Όμ κ΄κ³λΌλ κ°λ μ΄ ν©μ³μ§κ²μ΄λ€.
ν΄λ‘μ μ ν΅μ¬μ μ€μ½νλ₯Ό μ΄μ©ν΄μ, λ³μμ μ κ·Ό λ²μλ₯Ό λ«λ(νμ)κ²μ μλ€.
- μΈλΆν¨μ μ€μ½νμμ λ΄λΆν¨μ μ€μ½νλ‘ μ κ·Ό λΆκ°λ₯νλ€.
- λ΄λΆν¨μμμλ μΈλΆν¨μ μ€μ½νμμ μ μΈλ λ³μμ μ κ·Ό κΈ°λ₯νλ€.
- λ°λΌμ λ΄λΆ ν¨μλ μΈλΆν¨μμ μ μΈλ λ³μμ μ κ·Ό κ°λ₯νλ€.
ν¨μκ° νΈμΆλλ νκ²½κ³Ό λ³κ°λ‘, κΈ°μ‘΄μ μ μΈλμ΄ μλ νκ²½(μ΄νμ νκ²½)μ κΈ°μ€μΌλ‘ λ³μλ₯Ό μ‘°ννλ€.
- μΈλΆν¨μμ μ€νμ΄ μ’ λ£λ νμλ, ν΄λ‘μ ν¨μλ μΈλΆν¨μμ μ€μ½ν, μ¦, ν¨μκ° μ μΈλ μ΄νμ νκ²½μ μ κ·Όν μ μμ΅λλ€.
- μΈλΆ ν¨μ μ€μ½νκ° λ΄λΆν¨μμ μν΄ μΈμ λ μ§ μ°Έμ‘°λ μ μλ€.
- λ°λΌμ ν΄λ‘μ λ₯Ό λ¨λ°ν κ²½μ° νΌν¬λ¨Όμ€ μ νκ° λ°μν μλ μμ΅λλ€.
μμ μ€μ½νμ μλ³μλ₯Ό ν¬ν¨νμ¬ μ°μ¬μλ λ΄λΆ ν¨μ μ½λ μ체λ₯Ό μ΄νμ νκ²½(lexical environment)λΌκ³ λΆλ₯Ό μ μλ€.
πΈ : μ¬μ€ μ²μ μ½μ΄λ³΄λ©΄ νλλ μ΄ν΄κ° μλ κΊΌμμ, μ λ κ·Έλ¬μ΅λλ€,,, κ²λ€κ° execution contextμ λν
μ¬μ μ§μμ΄ μμΌλ©΄ λ νλ€κΊΌμμ νμ§λ§ μ²μ²ν μ½μ΄λ΄λ €κ°λ³΄λ©΄ κ°μ μ‘μΌμ€ μ μμκ±°μμ
ν΄λ‘μ μμ
νν ν¨μ( outer() ) λ΄μμ ν¨μλ₯Ό μ μ( inner() )νκ³ μ¬μ©νλ©΄ ν΄λ‘μ λΌκ³ νλ€.
νμ§λ§ λκ°λ μ μν ν¨μλ₯Ό 리ν΄νκ³ μ¬μ©μ λ°κΉ₯μμ νκ²λλ€.
μμλ₯Ό 보며 λ¨κ³λ³λ‘ μ΄ν΄ν΄κ°μ.
μλ μ½λλ₯Ό 보면
<script>
let n0 = 'n0';
function fn1() {
let n2 = 'n2';
console.log(n0, n1, n2)
}
function fn2() {
let n1 = 'n1';
console.log(n0, n1)
fn1();
}
fn2();
</script>
fn2 ν¨μμμμ fn1 ν¨μλ₯Ό νΈμΆνλ€ νλλΌλ
fn1μμλ fn2ν¨μμμ μλ n1λ³μμ μ κ·Όν μ μλ€.
κ·Έ μ΄μ λ μλ°μ€ν¬λ¦½νΈκ° μ μ μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ΄λ€.
ββPoint
λ§μ½ μ΄λμμ νΈμΆνλλμ λ°λΌμ μ κ·Ό λ²μκ° λ¬λΌμ§λ€λ©΄ κ·Έκ²μ
λμ μ€μ½ν λΌκ³ νλ€(Dynamic scope)
μλ°μ€ν¬λ¦½νΈλ ν¨μλ₯Ό μ΄λμ μ μΈνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ
μ μ μ€μ½νμ΄λ€(Lexical scope or Static scope)
μλ°μ€ν¬λ¦½νΈλ₯Ό λΉλ‘―ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄λ λ μ컬 μ€μ½ν
πΈ : μ²μ λμ μ€μ½νμ μ μ μ€μ½νμ μ μλ₯Ό λ€μμλ μ΄ν΄κ° μκ°κΈ° λλ¬Έμ μ κ°μ μ¬λμ΄ μμΌλ¦¬λΌ μκ°νκ³
μ‘°κ·Έλ§ν μμλ₯Ό ν΅ν΄ μλμμ μ‘°κΈ λ μμΈν? μ€λͺ ν΄λλ¦¬κ² μλλ€!!
ππ»μΆκ°μ€λͺ
πμ μ μ€μ½ν
var n1 = 1;
function foo() {
var n1 = 10;
bar();
}
function bar() {
console.log(n1);
}
foo();
μμμ ν¨μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μμ΄ νΈμΆμμ μ΄ μλ μ μΈμμ μ΄λΌκ³ νλλ°
λκ΅°κ°λ foo()ν¨μ μμ μλ n1 λ³μκ° 10μ΄κ³ bar()ν¨μμ console.log(x)κ°
foo()ν¨μμμμ μ€νλλ©΄μ 10μ΄ μΆλ ₯λλ κ²μ΄ μλκ° νκ³ ν·κ°λ¦¬κΈ° μ½λ€.
νμ§λ§ λ€μνλ² λ§κ·Έλλ‘ ν¨μμ μ μΈμμ μ μ€μ½νλ₯Ό κ²°μ νλ€κ³ νμΌλ,
barν¨μλ₯Ό μμ§ μ΄λμ κ° bar() ( =μ΄λ°μμΌλ‘) νΈμΆνκΈ° μ μ μμ±λ§(=μ μΈ)ν μμ μΌλ‘ λμκ°λ³΄λ©΄
bar ν¨μ μμ μμλ barν¨μμμ λ‘컬 λ³μλ‘xλ μμΌλ μ μλ³μμΈ κ°μ₯ μμ€μ var n1 = 1 μ μ°Έκ³ νμ¬
1μ΄ κ²°κ³Όκ°μΌλ‘ μΆλ ₯λκ² λλ€.
πλμ μ€μ½ν
μμ μμλ₯Ό 보면 λμ μ€μ½νμ ν΄μμ λμ μν€λ κ²μ μ΄λ ΅μ§ μμ κ²μ΄λ€.
μ΄λμμ νΈμΆνλλμ λ°λΌμ μ κ·Ό λ²μκ° λ¬λΌμ§λ€λ©΄ κ·Έκ²μ λμ μ€μ½ν λΌκ³ νμΌλ
λ§μ½ μλ°μ€ν¬λ¦½νΈκ° λμ μ€μ½νλ₯Ό μ¬μ©νλ€λ©΄, νΈμΆ μμΉμ λ°λΌ λ²μκ° μ§μ λλ
foo()ν¨μ μμμ νΈμΆλ 4λ²μ§Έμ€μ bar()λ foo() ν¨μ λ΄λΆμ var n1 = 10μΌ μν₯μ λ°μ
1μ΄ μλ 10μ΄ κ²°κ³Όκ°μΌλ‘ λμμ κ²μ΄λ€.
ππ»λ€μ λμμμ
μλλ ν΄λ‘μ ν¨μμ μμμ΄λ€.
let n0 = 'n0';
function fn1() {
function fn2() {
let n2 = 'n2';
console.log(n0, n1, n2);
}
let n1 = 'n1';
console.log(n0, n1)
fn2();
}
fn1();
μ΄λ κ² μμ κ°μ΄ ν¨μλ₯Ό ν¨μμμ μ μνλ©΄ κ·Έν¨μμ λΆλͺ¨ν¨μμ μ€μ½νμ μ κ·Όν μ μλ€λΌλ κ²μ
보μ¬μ€λ€.
νλ²λ μ 리ν΄μ
λ§νμλ©΄ ν΄λ‘μ λ λ΄λΆ ν¨μκ° μ μλ λ μΈλΆ ν¨μμ νκ²½μ κΈ°μ΅νκ³ μλ λ΄λΆ ν¨μλ₯Ό λ§νλ€.
μΈλΆ ν¨μ μμμ μ μΈλ λ΄λΆ ν¨μλ κ·Έ μΈλΆ ν¨μμ μ§μ λ³μλ
ν¨μμ μ κ·Όνμ¬ μ¬μ©ν μ μμ΅λλ€.
ββPoint
ν΄λ‘μ = νμνλ€,λλ΄νλ€
ν¨μκ°λ§λ€μ΄μ§λ μμ μμ λΆλͺ¨ν¨μκ° κ°μ§κ³ μλ μ€μ½ν μ ν¨λ²μ λ³μλ€μ λλ΄ν΄μ κ°μ§κ³ μλ€λ λ»μ΄λ€.
μΈμ λ μ§ νΈμΆνλ©΄ λΆλͺ¨ν¨μμ μ€μ½ν λ²μμ μ κ·Όν μ μλ€.
ν¬λ‘¬ κ°λ°μ λꡬλ₯Ό ν΅ν΄ μ μΈλ μ€μ½νλ₯Ό μ΄ν΄λ³΄λ©΄ Closure (fn1) μμ n1 : "n1"μ΄ λ€μ΄μλ κ²μ λ³Ό μ μλ€.
μ΄λ κ² ν¨μλ₯Ό ν¨μμμ μ μνλ©΄ κ·Έν¨μ{ fn2() }μ λΆλͺ¨ν¨μμ{ fn1() } μμ€μ½νμ ν΄λ‘μ ν¨μλ₯Ό ν΅ν΄
μ κ·Όν μ μλ€λΌλ κ²μ μ μ μλ€.
μλ°μ€ν¬λ¦½νΈκ° μλ λ€λ₯Έ μΈμ΄μ κ²½νμΌλ‘
outerμ€νλλ μκ° λλλ©΄ λ΄λΆμ λ³μλ€μ μ¬λΌμ§λ€κ³ μκ° νμ§λ§ κ°μ΄ μ°νλ€.
μμ±ν μμ μ μ€μ½ν 체μΈμ κ³μ λ€κ³ μλλ€ = ν΄λ‘μ μ νΉμ§
πμ 리
ν΄λ‘μ λ ν¨μμ ν΄λΉ ν¨μκ° μ μΈλ λ μ컬 νκ²½μ μ‘°ν©μ΄λ€. μΈλΆ ν¨μκ° λ°νλ νμλ μΈλΆ ν¨μμ λ³μ λ²μ 체μΈμ μ κ·Όν μ μλ ν¨μμ΄λ€. μ μ λ³μμ μ¬μ©μ μ΅μ νκ³ , μ 보λ₯Ό μλνκΈ° μν΄ μ¬μ©νλ€.
'πTechnical interview(Front)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Promise (0) | 2022.11.16 |
---|---|
[JavaScript] μ€μ½ν 체μΈμ΄λ? (0) | 2022.11.09 |
[JavaScript] Scopeλ? (0) | 2022.11.05 |
μ½λ°± ν¨μ(Callback) (0) | 2022.11.03 |
λΈλΌμ°μ μ£Όμμ°½μ Urlμ μ λ ₯νλ©΄ μ΄λ€ μΌμ΄ μΌμ΄λλκ°? (0) | 2022.10.23 |