JavaScript | ν΄λ‘μ λ 무μμΈκ°?
π¨π» JavaScript | ν΄λ‘μ λ 무μμΈκ°?
μ€λμ μλ°μ€ν¬λ¦½νΈμμ ν΄λ‘μ λΌλ κ°λ μ λν΄μ μ΄ν΄νκ³ μ μ¬μ©νλμ§μ λνμ¬ μμλ³΄κ² μ΅λλ€.
μ°λ¦¬κ° νμ΅ν λ΄μ©μ μ 리ν΄λ³΄μλ©΄ μλμ κ°μ΅λλ€.
- ν΄λ‘μ μ κ°λ
- ν΄λ‘μ λ μΈμ μ¬μ©λμ΄μ§λκ°?
- ν΄λ‘μ λ₯Ό μ μ¬μ©νλκ°?
1. ν΄λ‘μ μ κ°λ
"μνμ½λ©"μμ ν΄λ‘μ μ λν μ μλ₯Ό λ€μκ³Ό κ°μ΄ μ€λͺ νκ³ μμ΅λλ€.
ν΄λ‘μ (closure)λ λ΄λΆν¨μκ° μΈλΆν¨μμ λ§₯λ½(context)μ μ κ·Όν μ μλ κ²μ κ°λ₯΄ν¨λ€. ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄μ©ν κ³ λμ΄λμ ν ν¬λμ ꡬμ¬νλλ° νμμ μΈ κ°λ μΌλ‘ νμ©λλ€. |
μ°Έκ³ μ¬μ΄νΈ
μλ°μ€ν¬λ¦½νΈμμλ νΉμ ν¨μ λ΄λΆμ λλ€λ₯Έ ν¨μλ₯Ό μ μΈνλκ²μ΄ κ°λ₯νλ°μ, μ΄κ²μ 'λ΄λΆν¨μ' λΌκ³ λΆλ₯΄λ©° μ΄κ²μ ν΅ν΄ ꡬνν κ²μ΄ 'ν΄λ‘μ ' μ λλ€.
μΌλ¨ λ΄λΆν¨μκ° λ¬΄μμΈμ§ μμ보λλ‘ νκ² μ΅λλ€. μλμ μμ λ₯Ό 보μλ©΄ innerFuncμ΄λΌλ ν¨μ μμμ μ΅λͺ ν¨μλ₯Ό returnλ¬Έμ ν΅ν΄ λ°ννλ κ²μ λ³΄μ€ μ μμ΅λλ€.
μ΄μκ°μ΄ ν¨μ λ΄λΆμ λλ€λ₯Έ ν¨μλ₯Ό μ μΈνκ²μ μλ―Ένλ©° μμ μ½λμ μ€νκ²°κ³Όλ‘λ μλμ κ°μ΅λλ€.
μ¬κΈ°μ ν₯λ―Έλ‘μ΄ μ¬μ€μ λ΄λΆν¨μλ μΈλΆν¨μμ μ§μλ³μ(μμ½λμμλ textλ³μ)μ μ κ·Όμ΄ κ°λ₯νλ€λ μ μ λλ€.
μΌλ°μ μΌλ‘ μ°λ¦¬κ° μκ³ μλ ν¨μμ μ§μλ³μλ ν¨μμ λΌμ΄νμ¬μ΄ν΄κ³Ό ν¨κ»νλ©°, λ³ΈμΈμ μν μ λ€ νκ³ μ’ λ£λμμλ κ°μ§κ³ μλ μ§μλ³μλ κ°μ΄ μ¬λΌμ§κ² λ©λλ€.
νμ§λ§, λ΄λΆν¨μλ₯Ό ν΅ν΄ μ κ·Όν μΈλΆν¨μμ μ§μλ³μλ€μ κ°μ μΈλΆν¨μμ μ€νμ΄ λλμ μλ©Έλ μ΄νμλ μΈλΆμμ μ μ₯ν λ΄λΆν¨μλ₯Ό ν΅ν΄ μ κ·Όμ΄ κ°λ₯ν©λλ€. λ§λ‘ μ€λͺ νλ μ‘°κΈ μ΄λ €μ΄κ² κ°μΌλ μμ λ₯Ό ν΅ν΄ μμ보λλ‘ νκ² μ΅λλ€.
μλμ μμ μμλ μΈλΆν¨μμ 맀κ°λ³μλ‘ νΉμ μ΄λ¦(name)μ λ°μμ μλ‘μ΄ λ¬Έμμ΄(text)μ λ§λ€μμ΅λλ€. κ·Έλ¦¬κ³ μ΄ λ¬Έμμ΄μ λ΄λΆν¨μλ₯Ό ν΅ν΄ consoleμ μΆλ ₯μ νκ² νμμ΅λλ€.
μμ 14~16μ€μ 보면 μΈλΆν¨μλ₯Ό μ€νμν€λ λΆλΆμ λ³΄μ€ μ μμ΅λλ€. κ·Έλ¦¬κ³ μ΄ μΈλΆν¨μλ 16μ€ μ΄νμμ μ’ λ£λμ΄ μ¬λΌμ§κ² λμ΄μ§μ£ . μ€νλ κ° μΈλΆν¨μλ€μ λ΄λΆν¨μλ€μ λ°ννμ¬ test1~3 λ³μμ κ°κ° μ μ₯λμ΄μ§κ² λ©λλ€.
μ¬κΈ°μ κ° test1~3λ³μμ μ μ₯μ΄ λ 주체λ λ΄λΆν¨μκΈ° λλ¬Έμ μ’ λ£λμ΄ μλ©Έλ μΈλΆν¨μμ μ§μλ³μλ€ λν μλ©Έμ΄ λμ΄μΌ ν κ² κ°μ§λ§, 20~22λ²μ€μ μ€νν κ²°κ³Όκ° μλμκ°μ΄ λμ€λ κ²μ λ³΄μ€ μ μμ΅λλ€.
ν΄λ‘μ λ λ΄λΆν¨μμ λ°μ ν κ΄κ³λ₯Ό κ°μ§κ³ μλ μ£Όμ μ λλ€. λ΄λΆν¨μλ μΈλΆν¨μμ μ§μλ³μμ μ κ·Ό ν μ μλλ° μμ κ²°κ³Όμ²λΌ μΈλΆν¨μμ μ€νμ΄ λλμ μΈλΆν¨μκ° μλ©Έλ μ΄νμλ λ΄λΆν¨μκ° μΈλΆν¨μμ λ³μμ μ κ·Ό ν μ μμ΅λλ€. μ΄λ¬ν λ©μ»€λμ¦μ ν΄λ‘μ λΌκ³ ν©λλ€.
μμ½ν΄μ ν΄λ‘μ λ λ΄λΆν¨μκ° μΈλΆν¨μμ μ§μλ³μμ μ κ·Ό ν μ μκ³ , μΈλΆν¨μλ μΈλΆν¨μμ μ§μλ³μλ₯Ό μ¬μ©νλ λ΄λΆν¨μκ° μλ©Έλ λκΉμ§ μλ©Έλμ§ μλ νΉμ±μ μλ―Έν©λλ€.
μ°Έκ³ μ¬μ΄νΈ
2. ν΄λ‘μ λ μΈμ μ¬μ©λμ΄μ§λκ°?
ν΄λ‘μ λ λ΄λΆν¨μμ λ°μ ν κ΄κ³κ° μλ€κ³ μμμ μ€λͺ μ λλ Έλλ°μ, μ¬κΈ°μ λ΄λΆν¨μλ μΈλΆν¨μμ μ§μλ³μλ₯Ό κ°μ Έλ€ μ¬μ©μ΄ κ°λ₯νλ€ λ§μλλ Έμμ΅λλ€. μ¬μ€ λ΄λΆν¨μλ μΈλΆν¨μμ μ§μλ³μ λΏ μλλΌ λ§€κ°λ³μκ°λ μ°Έμ‘°ν΄μ μ¬μ©μ΄ κ°λ₯νλ°μ, μ΄λ¬ν κΈ°λ₯μ μ°½μμ μΈ λ°©λ²μΌλ‘ νμ©λ μ μμ΅λλ€.
μλμ λ΄λΆ(private)λ³μμμ λ λκΈλΌμ€ ν¬λ½ν¬λ(Douglas Crockford)μ μν΄ μ²μ μμ°λμμ΅λλ€.
ν΄λ‘μ μ κ°μ²΄(Dictionary)λ₯Ό μ΄μ©ν΄μ λ§μΉ ν΄λμ€μ Getter ν¨μ, Setterν¨μμ κ°μ κΈ°λ₯μ νλλ‘ κ΅¬νμ΄ κ°λ₯ν©λλ€. μ΄λ κ² μμ±νκ² λλ€λ©΄ κ·Έμ μΈλΆν¨μ μ§μλ³μμ κ°μ μ½μ΄μ€λκ² λΏ μλλΌ κ·Έ κ°μ λ³κ²½νλκ²μ΄ κ°λ₯ν΄μ§λλ€.
λ λ€λ₯Έ μμ λ‘λ λ°λ³΅λ¬Έ ν΄λ‘μ μμ κ° μμ΅λλ€. μ΄ μμ λ λ¨μν 0~9μ κ°μ setTimeout ν¨μλ₯Ό μ΄μ©ν΄ μΆλ ₯νλ ν¨μλ₯Ό ꡬννλ κ²μ λλ€. λ§μ½ ν΄λ‘μ λ₯Ό κ³ λ €νμ§ μκ³ μ΄λ₯Ό ꡬννλΌκ³ νλ€λ©΄ μλμ κ°μ΄ μμ±μ νκ² λ κ²μ λλ€.
νμ§λ§ μ΄λ κ² μμ±λ μ½λμ κ²°κ³Όλ μ°λ¦¬κ° μμνλ 0~9μ κ°μ μΆλ ₯νλ κ²μ΄ μλλΌ 10μ κ°μ λ°λ³΅ν΄μ μ°μ΄μ£Όκ² λ©λλ€.
μ΄μ μ¦μ¨, setTimeout ν¨μμ μΈμλ‘ λμ΄κ° μ΅λͺ ν¨μλ λͺ¨λ 0.1μ΄ λ€μ νΈμΆμ΄ λμ΄μ§κ² λ ν λ° κ·Έ μκ° μ¬μ΄μ λ°λ³΅λ¬Έμ΄ μ λΆ λμ iκ°μ 10μΌλ‘ λ§λ€μ΄ λ²λ ΈκΈ° λλ¬Έμ λλ€.
μ΄λ₯Ό μ°λ¦¬κ° μνλ 0~9μ κ°μ΄ μΆλ ₯λλλ‘ νκΈ° μν΄μλ ν΄λ‘μ λ₯Ό μ΄μ©νμ¬ λ§€ λ°λ³΅μ μ¦κ°λλ iκ°μ 맀κ°κ°μΌλ‘ λ°λ μΈλΆν¨μ νλλ₯Ό μμ±νκ³ κ·Έμμμ iκ°μ λ°μ setTimeoutμ μ€ννλ λ΄λΆν¨μλ₯Ό λ§λ€μ΄ μ£Όλ©΄ λ©λλ€.
μ΄λ κ² ν΄μ£Όκ² λλ©΄, μΈλΆν¨μλ₯Ό λ°λ³΅νμλ§νΌ μ€νν μν©μ΄ λ§λ€μ΄μ§κ³ κ° μΈλΆν¨μ 맀κ°κ°μΌλ‘ iκ°μ λ겨주μκΈ° λλ¬Έμ μ΄λ₯Ό λ΄μ₯ν¨μκ° μ°Έμ‘°ν΄μ μ¬μ©ν μ μκ² λμ΄μ§λ κ²μ΄μ£ .
μ΄λ₯Ό μ€ννκ² λλ©΄ μ°λ¦¬κ° μμΈ‘νλλ‘ μ μΆλ ₯μ΄ λμ΄μ§λλ€.
μ°Έκ³ μ¬μ΄νΈ
3. ν΄λ‘μ λ₯Ό μ μ¬μ©νλκ°?
μλ°μ€ν¬λ¦½νΈμμλ ν¨μκ° μ μΈλ λ μμ μ΄ μ κ·Όν μ μλ λ²μλ₯Ό μ νκ³ κΈ°μ΅νκ³ μλλ° μ΄κ²μ λ μ컬 μ€μ½νλΌκ³ ν©λλ€. κ·Έλ¦¬κ³ μ΄λ° λ μ컬 μ€μ½νμ μν΄ μΈλΆ ν¨μμ νκ²½μ κΈ°μ΅νκ³ μλ λ΄λΆ ν¨μκ° ν΄λ‘μ μ λλ€.
μ¬κΈ°μ "lexical"μ΄λ, μ΄νμ λ²μ μ§μ (lexical scoping) κ³Όμ μμ λ³μκ° μ΄λμμ μ¬μ© κ°λ₯νμ§ μκΈ° μν΄ κ·Έ λ³μκ° μμ€μ½λ λ΄ μ΄λμμ μ μΈλμλμ§ κ³ λ €νλ€λ κ²μ μλ―Έν©λλ€. λ¨μ΄ "lexical"μ μμμ μ μν μλ―Έλ₯Ό κ°μ§λ©°, μ€μ²©λ ν¨μλ μΈλΆ λ²μ(scope)μμ μ μΈν λ³μμλ μ κ·Όν μ μμ΅λλ€.
ν΄λ‘μ λ ν΄λμ€μ κ½€λ λΉμ·ν ꡬ쑰λ₯Ό κ°μ§κ³ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ ν΄λμ€ κ°λ μ΄ μλ(ES6μμλ μμ΅λλ€.) μλ°μ€ν¬λ¦½νΈμμλ ν΄λμ€λ₯Ό λμ νμ¬ μ°μ΄κΈ°λ ν©λλ€.
κ·Έλ λ€λ©΄ κ°μ²΄μ§ν₯μ κ°λ°μ μν΄μ ν΄λ‘μ λ₯Ό 무쑰건 μ¬μ©νλκ²μ΄ μ’μκΉμ?
κ·Έμλν λλ΅μ "μ μ ν μν©μ μ¬μ©νλ λ©λͺ¨λ¦¬ν λΉμ ν΄μ μμΌμ£Όμ" λΌκ³ λ΅λ³λλ¦¬κ³ μΆμ΅λλ€.
ν΄λ‘μ λ κ°μμ νκ²½μ κ°μ§λλ€. μ΄νκ²½μ κΈ°μ΅νκΈ° μν΄μ μΈλΆν¨μμ체λ₯Ό μλ©Έμν€μ§ μκ³ κΈ°μ΅νκΈ° λλ¬Έμ λΉμ°ν λ©λͺ¨λ¦¬ λν μλͺ¨λμ΄μ§κ²λλ€. κ·Έλ κΈ° λλ¬Έμ ν΄λ‘μ λ₯Ό μμ±ν΄λκ³ μ°Έμ‘°λ₯Ό μ κ±°νμ§ μλ κ²μ C++μμ λμ ν λΉμΌλ‘ κ°μ²΄λ₯Ό μμ±ν΄λκ³ λ©λͺ¨λ¦¬ν λΉμ ν΄μ νμ§ μλκ²κ³Ό λΉμ·ν©λλ€.
μ¦, ν΄λ‘μ λ₯Ό ν΅ν΄ λ΄λΆ λ³μλ₯Ό μ°Έμ‘°ν μ¬μ©μ΄ λλλ©΄ μ°Έμ‘°λ₯Ό μ κ±°νλκ²μ΄ λ©λͺ¨λ¦¬ ν¨μ¨μ μ’λ€κ³ λ³Ό μ μμ΅λλ€.
κ·Έλ κΈ°μ μμκ°μ΄ λ΅λ³μ λ릴μ μκ² λ€μ : )
μ°Έκ³ μ¬μ΄νΈ
π μλΈμ λͺ©
.