πŸ“JS μ—μ„œ Closure λž€?

10_2pangΒ·2023λ…„ 6μ›” 5일
0

βš½οΈνŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
43/94
post-thumbnail

πŸ‘¨β€πŸ’»Β μ‚¬κ±΄


  • μžλ°”μŠ€ν¬λ¦½νŠΈ μŠ€ν„°λ””λ₯Ό ν•˜λ©΄μ„œ λΆ€μ‘±ν–ˆλ˜ Closure에 λŒ€ν•΄ κΉ¨λΆ€ν•˜μ˜€λ‹€.

βœ…Β ν•΄κ²°


ν΄λ‘œμ €

ν΄λ‘œμ €μ˜ μ •μ˜


MDN

  • μ •μ˜ - ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ μ‘°ν•©

μ½”μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈ

  • μ •μ˜ - μ–΄λ–€ ν•¨μˆ˜ Aμ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜ aλ₯Ό μ°Έμ‘°ν•˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜ Bλ₯Ό μ™ΈλΆ€λ‘œ 전달할 경우, A의 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ’…λ£Œλœ 이후에도 λ³€μˆ˜ a κ°€ 사라지지 μ•ŠλŠ” ν˜„μƒ

λ‚΄κ°€ μ΄ν•΄ν•œ ν΄λ‘œμ €

  • μ •μ˜ - μžμ‹ μ΄ 선언될 λ‹Ήμ‹œμ˜ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜

ν΄λ‘œμ €μ™€ μΉœν•΄μ§€κΈ°


좜처 : [10λΆ„ ν…Œν¬ν†‘] 꼬재의 ν΄λ‘œμ €

ν΄λ‘œμ € 예제 μ½”λ“œ

function sum(x){
	return function (y) {
		return x+y;
	};
}

const add = sum(1);
console.log(add(2));

ν΄λ‘œμ € λ™μž‘λ°©μ‹

ν΄λ‘œμ €μ˜ λ™μž‘ 방식을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

Lexical Environment - Lexical Environment Record
										γ„΄ Outer Environment Reference

표사.png

  1. μ½”λ“œ 평가 μ§„ν–‰ ( Global )

    1-1. Global 에 Lexical Environment 생성 ν›„ μ „μ—­μ½”λ“œ 평가

    Global_1.png

    1-2. Lexical Environment Record 에 add λ³€μˆ˜μ™€ sum ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

    1-3. call μŠ€νƒμ— Global Lexical Environment 푸쉬

  2. add λ³€μˆ˜μ— ν• λ‹Ήλœ sum ν•¨μˆ˜ μ‹€ν–‰

    2-1. sum ν•¨μˆ˜ 에 Lexical Environment 생성 ν›„ μ „μ—­μ½”λ“œ 평가

    2-2. Lexical Environment Record 에 sum ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ x 와 return 문의 읡λͺ…ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

    sum_1.png

    2-3. Outer Environment Reference μ—λŠ” μƒμœ„ μŠ€μ½”ν”„μΈ Global Lexical Environment λ₯Ό 가리킴

    2-4. Call μŠ€νƒμ— sum Lexical Environment 푸쉬

    2-5. μ½”λ“œ 평가 μ’…λ£Œν›„, λ§€κ°œλ³€μˆ˜ x 에 ν• λ‹Ήλœ 값인 1을 Lexical Environment Record 에 μ €μž₯

    sum_2.png

    2-6. 더이상 μ‹€ν–‰ν•  μ½”λ“œ μ—†κΈ° λ•Œλ¬Έμ— call stack μ—μ„œ pop

  3. λ‹€μ‹œ Global Lexical Environment 둜 λŒμ•„μ˜¨ν›„, add ν•¨μˆ˜μ— sumν•¨μˆ˜μ˜ 리턴값인 읡λͺ…ν•¨μˆ˜ ν• λ‹Ή

    3-1. Global Lexical Environment Record 에 읡λͺ…ν•¨μˆ˜ ν• λ‹Ή

    Global_2.png

  4. λ§ˆμ§€λ§‰ μ½”λ“œμΈ console.log λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, add ν•¨μˆ˜ 호좜

    4-1. add Lexical Environment 생성 ν›„ μ½”λ“œν‰κ°€

    4-2. λ§€κ°œλ³€μˆ˜ y λ₯Ό ν˜Έμ΄μŠ€νŒ…ν•˜μ—¬ add Lexical Environment Record 에 μ €μž₯

    4-3. Outer Environment Reference μ—λŠ” μƒμœ„ μŠ€μ½”ν”„μΈ sum Lexical Environment λ₯Ό 가리킴

    add_1.png

    β†’ μ΄λ•Œ, ν΄λ‘œμ € ν˜„μƒμ΄ λ‚˜νƒ€λ‚©λ‹ˆλ‹€! λΆ„λͺ… sum 은 pop λ˜μ–΄μžˆλŠ” κ²ƒμœΌλ‘œ μ•Œκ³ μžˆμ–΄ κ°€λ¦¬ν‚¬μˆ˜ μ—†λŠ”κ²ƒμœΌλ‘œ 보인닀. κ·ΈλŸ¬λ‚˜ μ΄ˆκΈ°μ— μ½”λ“œ 평가λ₯Ό ν• λ•Œ, 읡λͺ…ν•¨μˆ˜μ˜ μ„ μ–Έκ³Ό λ™μ‹œμ— Outer Environment Reference 에 λ¨Όμ € sum 의 Lexical Environmentd μ €μž₯ν•˜μ˜€κΈ° λ•Œλ¬Έμ— κ°€λ¦¬ν‚¬μˆ˜μžˆλ‹€.

    4-4. Call μŠ€νƒμ— add Lexical Environment 푸쉬 ν›„ μ½”λ“œν‰κ°€ μ’…λ£Œ

    4-5. μ½”λ“œ ν•œμ€„μ”© μ‹€ν–‰ ν•˜μ—¬, y λ§€κ°œλ³€μˆ˜μ— 2λ₯Ό ν• λ‹Ή

    add_2.png

    4-6. λ‹€μŒμœΌλ‘œ return 문인 x+y μ‹€ν–‰

    4-7. x의 λ§€κ°œλ³€μˆ˜κ°€ Lexical Environment Record 에 λ³΄μ΄μ§€μ•ŠκΈ° λ•Œλ¬Έμ— Outer Environment Reference 의 Lexical Environment Record λ₯Ό μ°Ύμ•„ λ‚˜μ„ λ‹€.

    4-8. μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ‹€λ©΄ 4-7 과정을 λ°˜λ³΅ν•˜μ—¬ Global Lexical Environment κΉŒμ§€ νƒμƒ‰ν•œλ‹€. ( λ§Œμ•½ Global Lexical Environment 에도 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ‹€λ©΄ reference μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.)

    4-9. sum Lexical Environment 에 ν• λ‹Ήν•œ x 값이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— κ·Έ 값을 확인후 본래의 κ°’μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

    4-10. κ³„μ‚°λœ κ°’ ( 1 + 2 ) 인 3의 값이 λ¦¬ν„΄λ©λ‹ˆλ‹€.

    4-11. 더이상 μ‹€ν–‰ν•  μ½”λ“œ μ—†κΈ° λ•Œλ¬Έμ— call stack μ—μ„œ add Lexical Environment λ₯Ό pop

    4-12. Global Lexical Environment μ—μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ 남은 console.log(3)을 좜λ ₯ν•œλ‹€.

    4-13. Global Lexical Environment 도 call stack μ—μ„œ pop λ˜λ©΄μ„œ ν”„λ‘œκ·Έλž¨ μ’…λ£Œ

ν΄λ‘œμ € μž₯/단점


μž₯점

  • λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό μΊ‘μŠν™”ν•˜μ—¬ μ „μ—­λ³€μˆ˜μ˜ λ°©ν•΄λ₯Ό λ°©μ§€
  • μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 있음
  • μ™ΈλΆ€ λ³€μˆ˜μ— μ ‘κ·Όν•˜μ—¬ 값을 λ³€κ²½ν•˜κ±°λ‚˜ μ½μ–΄μ˜¬ 수 있기 λ•Œλ¬Έμ—, 비동기 μ²˜λ¦¬λ‚˜ 콜백 ν•¨μˆ˜μ—μ„œ μƒνƒœλ₯Ό μœ μ§€ν•˜κΈ° μ’‹μŒ

단점

  • λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λ“±μ˜ μž‘μ—…μ΄ λ§Žμ•„μ§€λ©΄, μ½”λ“œμ˜ λ³΅μž‘λ„κ°€ 증가
  • λ‚¨λ°œν•˜κ²Œ λœλ‹€λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒ
profile
μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 이광렬 μž…λ‹ˆλ‹€ 🌸

0개의 λŒ“κΈ€