ν¨μμ λ μ컬 νκ²½μ μ‘°ν©
ν¨μκ° μμ±λ λΉμμ μΈλΆ λ³μλ₯Ό κΈ°μ΅
μμ± μ΄νμλ κ³μ μ κ·Ό κ°λ₯
ν΄λ‘μ
λ ν¨μλ₯Ό μ€μ²©μΌλ‘ μ¬μ©ν¨μΌλ‘μ¨ λ³μμ λ μ컬 νκ²½(μ΄νμ λ²μ)
μ μ§μ ν΄μ£Όλ κ²μ μλ―Ένλ€. μ¬κΈ°μ "lexical"μ΄λ, μ΄νμ λ²μ μ§μ (lexical scoping) κ³Όμ μμ λ³μκ° μ΄λμμ μ¬μ© κ°λ₯νμ§ μκΈ° μν΄ κ·Έ λ³μκ° μμ€μ½λ λ΄ μ΄λμμ μ μΈλμλμ§ κ³ λ €νλ€λ κ²μ μλ―Ένλ€.
ν¨μ μ μΈμΌλ‘ μΈν΄ μ€μ½νκ° λ°μνκ² λκ³ , κ°κ° μμ±λ μ€μ½νμ λ°λΌμ λ€λ₯Έ λ μ컬 νκ²½(Lexical Environment)
μ κ°λλ€.
λ μ컬 νκ²½μ ν¬κ² λΆλ₯ν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
μ μ Lexical νκ²½ > μΈλΆ ν¨μ Lexical νκ²½ > λ΄λΆ ν¨μ(μ΅λͺ ν¨μ) Lexical νκ²½
function init() {
var name = "Mozilla"; // nameμ initμ μν΄ μμ±λ μ§μ λ³μμ΄λ€.
function displayName() { // displayName() μ λ΄λΆ ν¨μμ΄λ©°, ν΄λ‘μ λ€.
alert(name); // λΆλͺ¨ ν¨μμμ μ μΈλ λ³μλ₯Ό μ¬μ©νλ€.
}
displayName();
}
init();
μ μμ λ init
ν¨μμ κ·Έ λ΄λΆμ ν¨μ displayName
ν¨μκ° μ€μ²©λ ꡬ쑰μ΄λ€. μ΄ λ init
ν¨μλ displayName
ν¨μλ₯Ό νμ μΈλΆ ν¨μμ ν΄λΉνκ³ , displayName
ν¨μλ λ΄λΆ ν¨μμ ν΄λΉνλ€.
κ·Έλ λ€λ©΄ μ΄μ λ μ컬 νκ²½μ νμ
ν μ μλ€. init
ν¨μμ μ½λλΈλ λ²μλ μΈλΆ lexical νκ²½μ΄λ€. init
ν¨μ λ΄λΆμ μ μΈλ var name = "Mozilla"
λ μΈλΆ λ μ컬 νκ²½μ μ μΈλ λ³μμμ μ μ μλ€. λ§μ°¬κ°μ§λ‘ displayName
ν¨μ λ΄λΆμ μ½λ λΈλ λ²μλ λ΄λΆ lexical νκ²½ λ²μλΌκ³ λ³Ό μ μλ€.
μ ν΄λ‘μ μ μ€λͺ μμ ν¨μμ λ μ컬 νκ²½μ μ‘°ν©μ΄λΌκ³ ν μ΄μ λ μ΄μ κ°λ€. ν¨μλ₯Ό μμ±ν¨κ³Ό λμμ λ μ컬 νκ²½μ΄ μ μλλ€. ν΄λ‘μ λ λ μ컬 νκ²½μ κ°λ μ μ΄μ©νμ¬ μμ±ν κ°λ μ΄κΈ° λλ¬Έμ΄λ€.
ν΄λ‘μ λ κ°λ
μ μ€λͺ
νλ κ²λ³΄λ€ μμ λ‘ μ΄ν΄νλ κ²μ΄ λ μ΄ν΄νκΈ° μ½λ€.
λ§μ°¬κ°μ§λ‘ mdnμ μμ λ₯Ό μ΄ν΄λ³΄μ
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
//myFuncλ³μμ displayNameμ 리ν΄ν¨
//μ ν¨λ²μμ μ΄νμ νκ²½μ μ μ§
myFunc();
//리ν΄λ displayName ν¨μλ₯Ό μ€ν(name λ³μμ μ κ·Ό)
//"Mozilla" μ°½μ΄ λμμ§λ€.
μμ λ μ컬 νκ²½μμ μ¬μ©λ μμ μ λΉμ·νλ€. μλ‘ μΆκ°λ myFunc
λ³μμ μ£Όλͺ©νμ. myFunc
λ³μμλ makeFunc ν¨μλ₯Ό μ€νν 리ν΄κ°, μ¦ ν¨μλ₯Ό λ΄κ³ μλ€. displayName
ν¨μλ λ΄λΆ μ€μ½νμ΄λ―λ‘ μΈλΆ μ€μ½νμ name = "Mozilla"
κ°μ μ°Έμ‘°ν μ μλ€.
μ¬κΈ°μ ν΄λ‘μ μ κ°λ
μ΄ λͺ
νν΄μ§λ€. 맨 μλ μ€μ myFunc( )
λ₯Ό νΈμΆνλ©΄ Mozilla
κ° μ°½μ λ¨λ κ²μ νμΈν μ μλ€. ν΄λ‘μ λ ν¨μκ° μμ±λ λΉμμ μΈλΆ λ³μλ₯Ό κΈ°μ΅νλ€κ³ νκ³ , μμ± μ΄νμλ κ³μ μ κ·Ό κ°λ₯νλ€κ³ νλ€.
myFunc
λ₯Ό κΈ°μ΅νλ ν΄λ‘μ λ€.μ¦, myFunc
μ μ μ₯ν displayName
μ 리ν΄κ°μ μΈλΆ ν¨μ makeFunc
μ μ μ₯λ name = "Mozilla"
κ°μ μ μ₯νκ³ μ¬μ©νλ κ²μ΄λ€.
μ΄λ displayName
ν¨μκ° ν΄λ‘μ λ₯Ό νμ±νμ¬ κ°λ₯ν μΌμ΄λ€.
μΌλ°μ μΈ ν¨μμ κ²½μ° ν¨μ μ’
λ£ μ ν¨μ λ΄λΆ λ³μμ λ μ΄μ μ κ·Όν μ μκ² λλ€.
κ·Έλ λ€λ©΄ μ΄λ€ κ²½μ°μ ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ μ’μκΉ?
μν μ μ§
ν΄λ‘μ κ° κ°μ₯ μ μ©νκ² μ¬μ©λλ μν©μ νμ¬ μνλ₯Ό κΈ°μ΅νκ³ λ³κ²½λ μ΅μ μνλ₯Ό μ μ§νλ κ²μ΄λ€.
λ§μ½ μλ°μ€ν¬λ¦½νΈμ ν΄λ‘μ λΌλ κΈ°λ₯μ΄ μλ€λ©΄ μνλ₯Ό μ μ§νκΈ° μν΄ μ μ λ³μλ₯Ό μ¬μ©ν μ λ°μ μλ€. μ μ λ³μλ μΈμ λ μ§ λꡬλ μ κ·Όν μ μκ³ λ³κ²½ν μ μκΈ° λλ¬Έμ λ§μ λΆμμ©μ μ λ°ν΄ μ€λ₯μ μμΈμ΄ λλ―λ‘ μ¬μ©μ μ΅μ ν΄μΌ νλ€.
μ μ λ³μμ μ¬μ© μ΅μ
μ μ λ³μλ μΈμ λ μ§ λꡬλ μ κ·Όν μ μκ³ λ³κ²½ν μ μλ€. μ΄λ μλμΉ μκ² κ°μ΄ λ³κ²½λ μ μλ€λ κ²μ μλ―Ένλ€. λ§μ½ λκ΅°κ°μ μν΄ μλμΉ μκ² μ μ λ³μμ κ°μ΄ λ³κ²½λλ€λ©΄ μ΄λ μ€λ₯λ‘ μ΄μ΄μ§λ€.
μΆμ²: https://poiemaweb.com/js-closure
ν΄λ‘μ λ₯Ό ν΅ν΄ ν¨μ λ΄λΆμ 리ν΄λ κ°μ λ³μμ μ μ₯νλ©΄ μΈλΆ ν¨μμ λ³μλ₯Ό κ³μ μ¬μ©ν μ μμλ€. μ΄λ μ΄μ μ΄λ ν λ°©μμΌλ‘λ μΈλΆ μ€μ½νμμλ λ³μμ μ§μ μ μΈ μ°Έμ‘°κ° λΆκ°λ₯νλ€λ μλ―Έμ΄κΈ°λ νλ€.
μ΄λ¬ν κ³Όμ μμ μ€λ ν΄λ‘μ μ μ₯μ
μ λ€μκ³Ό κ°λ€.
μΊ‘μν (μ 보μ μ κ·Ό μ ν)
- μμ€μ½λλ₯Ό μμ±νλ κ³Όμ μμ λ³μμ μ§μ μ μΈ μ κ·Όμ μμ ν μ°¨λ¨ν¨μΌλ‘μ¨
side effect(μλλμ§ μμ λ³κ²½)
λ₯Ό μ΅μν νλ€.
ν¨μ λͺ¨λνμ μ 리
λͺ¨λν
: ν¨μ νλλ₯Ό μμ ν λ 립μ μΈ λΆν ννλ‘ λΆλ¦¬νλ κ².- ν΄λ‘μ λ₯Ό ν΅ν΄ λ°μ΄ν°μ λ©μλλ₯Ό λ¬ΆμΌλ©΄ ν¨μ μ¬μ¬μ©μ±μ΄ κ·Ήλν λμ΄ λͺ¨λνμ μ 리νλ€.