I never understood JavaScript closures - Lee-hyuna/33-js-concepts-kr GitHub Wiki

μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λ‘œμ €λ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

(...음?역섀이겠지...)

원문 : https://medium.com/dailyjs/i-never-understood-javascript-closures-9663703368e8

제λͺ©μ—μ„œ μœ μΆ”ν•  수 μžˆλ“―μ΄ μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λ‘œμ €λŠ” 항상 λ―ΈμŠ€ν…Œλ¦¬μž…λ‹ˆλ‹€. 수 λ§Žμ€ 글듀을 읽고, μ—…λ¬΄μ—μ„œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•΄λ³΄κ³ , 가끔은 ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” 쀑에 κΉ¨λ‹¬μŒμ—†μ΄ ν΄λ‘œμ €λ₯Ό μ‚¬μš© ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ΅œκ·Όμ— λ§ˆμΉ¨λ‚΄ ν΄λ‘œμ €λ₯Ό μ„€λͺ…ν•΄μ£ΌλŠ” 토크 μžλ¦¬μ— κ°”μŠ΅λ‹ˆλ‹€. 이 κΈ€μ—μ„œ ν΄λ‘œμ €λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ 이 방법을 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€. CodeSmith와 JavaScript The Hard Parts μ‹œλ¦¬μ¦ˆμ— μ°Έμ—¬ν•œ λΆ„μ—κ²Œ 곡을 λŒλ¦¬κ² μŠ΅λ‹ˆλ‹€

μ‹œμž‘ν•˜κΈ° 전에

μ–΄λ–€ κ°œλ…λ“€μ€ ν΄λ‘œμ €λ₯Ό μ‚΄νŽ΄λ³΄κΈ° 전에 더 μ‚΄νŽ΄λ³΄λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. 그것듀 쀑에 ν•˜λ‚˜κ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμž…λ‹ˆλ‹€.

This article λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 잘 μ„€λͺ…ν•œ κΈ€μž…λ‹ˆλ‹€. 이 κΈ€μ—μ„œ λ§ν•˜λŠ” λ‚΄μš©μ€:

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ½”λ“œκ°€ 싀행될 λ•Œ, μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” ν™˜κ²½μ€ 맀우 μ€‘μš”ν•˜κ³ , λ‹€μŒ 쀑 ν•˜λ‚˜λ‘œ ν‰κ°€λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. :

μ „μ—­ μ½”λ“œ β€” μ½”λ“œκ°€ 처음으둜 μ‹€ν–‰λ˜λŠ” κΈ°λ³Έ ν™˜κ²½.

ν•¨μˆ˜ μ½”λ“œ β€” μ‹€ν–‰μ˜ 흐름이 ν•¨μˆ˜μ˜ 본문으둜 λ“€μ–΄ 갈 λ•Œλ§ˆλ‹€.

(…)

(…), μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μš©μ–΄λŠ” ν˜„μž¬μ˜ μ½”λ“œκ°€ ν‰κ°€λ˜κ³  μžˆλŠ” ν™˜κ²½, μŠ€μ½”ν”„λΌκ³  μ •μ˜ν•΄λ΄…λ‹ˆλ‹€.

λ°”κΎΈμ–΄ λ§ν•˜λ©΄, ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν–ˆμ„ λ•Œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€. λͺ‡λͺ‡ λ³€μˆ˜λ“€μ€ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€μ—μ„œ 선언이 λ˜μ–΄μ Έμ§‘λ‹ˆλ‹€. μ „μ—­ λ³€μˆ˜λ“€μ„ ν˜ΈμΆœν•©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ΄ ν•¨μˆ˜κ°€ 호좜 ν•˜μ˜€μ„ λ•Œ, 무슨 일이 μΌμ–΄λ‚ κΉŒμš”?

λͺ‡ 가지 μŠ€ν…μ΄ μžˆμŠ΅λ‹ˆλ‹€:

  1. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μƒˆλ‘œμš΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ, 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ§Œλ“¦λ‹ˆλ‹€.
  2. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 자기 μžμ‹ μ˜ λ³€μˆ˜ 집합을 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이듀 λ³€μˆ˜λ“€μ€ μ§€μ—­μ—μ„œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 될 κ²ƒμž…λ‹ˆλ‹€.
  3. μƒˆλ‘œμš΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μŠ€νƒμ— μΆ”κ°€λ©λ‹ˆλ‹€. μ‹€ν–‰ μŠ€νƒμ€ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ μœ„μΉ˜λ₯Ό μΆ”μ ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

μ–Έμ œ ν•¨μˆ˜κ°€ 끝이 λ‚ κΉŒμš”? μ–Έμ œ λ°˜ν™˜(return) ꡬ문이 μžˆκ±°λ‚˜ λ‹«νžˆλŠ” μ€‘κ΄„ν˜Έ } κ°€ μžˆλŠ” 경우. ν•¨μˆ˜κ°€ 끝났을 λ•Œ μ•„λž˜μ˜ λ‚΄μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€.:

  1. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μŠ€νƒμ—μ„œ λΆ„λ¦¬λ©λ‹ˆλ‹€.
  2. ν•¨μˆ˜λŠ” λ°˜ν™˜ 값을 호좜 μ»¨ν…μŠ€νŠΈλ‘œ λ‹€μ‹œ μ „λ‹¬ν•©λ‹ˆλ‹€. 호좜 μ»¨ν…μŠ€νŠΈλŠ” 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œμ„œ κΈ€λ‘œλ²Œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ˜λŠ” λ‹€λ₯Έ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμž…λ‹ˆλ‹€. κ·Έ μ‹œμ μ—μ„œ λ°˜ν™˜κ°’μ„ μ²˜λ¦¬ν•˜λŠ” 것은 호좜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 달렀 μžˆμŠ΅λ‹ˆλ‹€. λ°˜ν™˜κ°’μ€ 객체, λ°°μ—΄, ν•¨μˆ˜, λΆ€μšΈ λ“± 무엇이든 될 수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ ν•¨μˆ˜μ— λ°˜ν™˜ ꡬ문이 μ—†λ‹€λ©΄, undefined을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  3. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ†Œλ©Έλ˜λŠ” 것은 μ€‘μš” ν•©λ‹ˆλ‹€.μ†Œλ©Έλ˜λ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ μ„ μ–Έλœ λͺ¨λ“  λ³€μˆ˜λŠ” μ‚­μ œλ©λ‹ˆλ‹€. λ³€μˆ˜λŠ” 더이상 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 지역 λ³€μˆ˜λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

맀우 기본적인 예

ν΄λ‘œμ €λ₯Ό μ•ŒκΈ° 전에 λ‹€μŒ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ΄…μ‹œλ‹€. 이것은 이 글을 μ½λŠ” μ‚¬λžŒμ€ μ•„λž˜μ˜ μ½”λ“œκ°€ 무엇을 ν•˜λŠ”μ§€ μ •ν™•νžˆ μ•Œκ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

1: let a = 3
2: function addTwo(x) {
3:   let ret = x + 2
4:   return ret
5: }
6: let b = addTwo(a)
7: console.log(b)

μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ μ‹€μ œ μž‘λ™ 방식을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ μ‹€μ œ μž‘λ™ 방식을 μ•„μ£Ό μžμ„Έν•˜κ²Œ μ•Œμ•„λ³΄λ„λ‘ ν•©μ‹œλ‹€.

1ν–‰μ—μ„œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μƒˆλ‘œμš΄ λ³€μˆ˜ aλ₯Ό μ„ μ–Έν•˜κ³  숫자 3을 ν• λ‹Ήν•©λ‹ˆλ‹€.

  1. λ‹€μŒμ€ κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€. 2ν–‰μ—μ„œ λΆ€ν„° 5행은 μ‹€μ œλ‘œ ν•¨κ»˜ μžˆμŠ΅λ‹ˆλ‹€. 이 λΆ€λΆ„μ—μ„œ 무슨 일이 μΌμ–΄λ‚ κΉŒμš”? μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— addTwo 이름을 가진 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 그리고 addTwo에 무엇이 ν• λ‹Ήλ κΉŒμš”? ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 두 개의 μ€‘κ΄„ν˜Έ {} 사이에 μžˆλŠ” 것이 addTwo에 ν• λ‹Ήν•©λ‹ˆλ‹€. μ½”λ“œμ˜ 내뢀에 ν•¨μˆ˜λŠ” 검증 λ˜μ§€ μ•Šκ³ , μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ―Έλž˜μ— μ‚¬μš©λ  λ³€μˆ˜λ₯Ό μ €μž₯ν‘λ‹ˆλ‹€.
  2. κ·Έ λ‹€μŒ 6ν–‰μœΌλ‘œ λ„˜μ–΄ μ˜΅λ‹ˆλ‹€. 이 뢀뢄은 맀우 간단해 λ³΄μ΄μ§€λ§Œ μ΄κ³³μ—μ„œ 합쳐져 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 첫번째둜 μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μƒˆλ‘œμš΄ λ³€μˆ˜κ°€ 선언이 되고, label을 b둜 μ§€μ •ν•©λ‹ˆλ‹€. λ³€μˆ˜κ°€ μ„ μ–Έλ˜μž 마자 undefined의 값을 κ°€μ§‘λ‹ˆλ‹€.
  3. κ·Έλ‹€μŒ, μ—¬μ „νžˆ 6ν–‰μž…λ‹ˆλ‹€. μ—°μ‚°μžλ₯Ό ν• λ‹Ήν•œ 것을 볼수 μžˆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜ bλ₯Ό μƒˆλ‘œμš΄ λ³€μˆ˜λ‘œ ν• λ‹Ήν•˜κΈ° μœ„ν•΄ κΈ°λ‹€λ¦½λ‹ˆλ‹€. κ·Έ λ‹€μŒ ν•¨μˆ˜κ°€ 호좜된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜ 뒀에 λ‘₯κ·Ό κ΄„ν˜Έ (...)κ°€ ν‘œμ‹œλ˜λ©΄ 이 것이 ν•¨μˆ˜κ°€ 호좜이 되고 μžˆλ‹€λŠ” μ‹ ν˜Έ μž…λ‹ˆλ‹€. μˆœμ‹κ°„μ— λͺ¨λ“  ν•¨μˆ˜λŠ” 무언가(κ°’, 객체 λ˜λŠ” μ •μ˜λ˜μ§€ μ•Šμ€)λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λœ 것은 λ³€μˆ˜ b에 ν• λ‹Ήλ©λ‹ˆλ‹€. ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λœ 것은 λ³€μˆ˜ b에 할당이 λ©λ‹ˆλ‹€.
  4. κ·ΈλŸ¬λ‚˜ 첫번째둜 addTwo라고 λ ˆμ΄λΈ”λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ©”λͺ¨λ¦¬μ—μ„œ addTwoλΌλŠ” λ³€μˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. addTwoλ³€μˆ˜λ₯Ό 찾으면 step2(2ν–‰μ—μ„œ 5ν–‰)μ—μ„œ μ •μ˜ λ˜μ–΄ μ§‘λ‹ˆλ‹€. 그리고 lo 그리고 addTowλŠ” ν•¨μˆ˜ μ •μ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜ aλŠ” ν•¨μˆ˜μ˜ 인자둜 전달이 λ˜μ–΄ μ§‘λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ©”λͺ¨λ¦¬μ—μ„œ λ³€μˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. λ³€μˆ˜λ₯Ό 찾으면 κ°’ 3을 가지고, ν•¨μˆ˜μ˜ 인자둜 숫자 3이 전듀이 λ©λ‹ˆλ‹€. ν•¨μˆ˜μ˜ 싀행을 κΈ°λ‹€λ¦½λ‹ˆλ‹€.
  5. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ „ν™˜μ΄ λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성이 λ˜μ–΄μ§€κ³  이것은 addTwo μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλΌλŠ” 이름을 κ°€μ§‘λ‹ˆλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 콜 μŠ€νƒμ— μŒ“μ—¬μ§‘λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ 무엇이 처음으둜 호좜이 λ˜λ‚˜μš”?
  6. μƒˆλ‘œμš΄ λ³€μˆ˜ ret은 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 선언이 λ˜μ–΄μ ΈμžˆμŠ΅λ‹ˆλ‹€λΌλŠ” λŒ€λ‹΅μ€ μ˜³μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ˜³μ€ λŒ€λ‹΅μ€ ν•¨μˆ˜μ˜ 첫번째둜 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ₯Ό λ³Ό ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ λ³€μˆ˜ xλŠ” 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 선언이 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 그리고 3 값이 인자둜 전달이 λ˜μ–΄μ‘ŒκΈ° λ•Œλ¬Έμ— λ³€μˆ˜ x에 숫자 3이 ν• λ‹Ήλ˜μ–΄ μ§‘λ‹ˆλ‹€.
  7. κ·Έ λ‹€μŒ μŠ€νƒ­μ€ μƒˆλ‘œμš΄ λ³€μˆ˜ ret은 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 선언이 λ˜μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€. 값은 undefinedκ°€ μ…‹νŒ…μ΄ λ˜μ–΄ μ§‘λ‹ˆλ‹€. (3ν–‰)
  8. 3ν–‰μ—μ„œ μ—¬μ „νžˆ, 좔가적인 μž‘μ—…μ΄ ν•„μš” ν•©λ‹ˆλ‹€. 첫번째둜 x의 값이 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜ xλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. 첫번째둜 λ³€μˆ˜ xλ₯Ό 지역 μ‹€ν–‰ μ»¨ν…ŒμŠ€νŠΈμ—μ„œ μ°ΎμŠ΅λ‹ˆλ‹€. 그리고 ν•˜λ‚˜λ₯Ό λ°œκ²¬ν•˜κ³ , 값은 3μž…λ‹ˆλ‹€. 그리고 λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžλŠ” 숫자 2μž…λ‹ˆλ‹€. 그리고 λ³€μˆ˜ ret에 더해진 결과값인 5κ°€ 할당이 λ©λ‹ˆλ‹€.
  9. 4ν–‰. ret λ³€μˆ˜μ˜ 값이 λ°˜ν™˜μ΄ λ˜μ–΄ μ§‘λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ‹€λ₯Έ 것을 μ°ΎμŠ΅λ‹ˆλ‹€. ret은 5값을 ν¬ν•¨ν•¨λ‹ˆλ‹€. ν•¨μˆ˜λŠ” 숫자 5λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 그리고 ν•¨μˆ˜λŠ” 끝이 λ‚©λ‹ˆλ‹€.
  10. 4ν–‰, 5ν–‰. ν•¨μˆ˜λŠ” λμ΄λ‚©λ‹ˆλ‹€.지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ†Œλ©Έμ΄ λ©λ‹ˆλ‹€. λ³€μˆ˜ x 그리고 ret은 μ‚¬λΌμ§‘λ‹ˆλ‹€. x와 ret은 더이상 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ»¨ν…μŠ€νŠΈλŠ” μ½œμŠ€νƒμ—μ„œ λΉ μ Έλ‚˜κ°€κ³  λ°˜ν™˜λ˜λŠ” 값은 호좜 μ»¨ν…μŠ€νŠΈμ— λ°˜ν™˜λ˜μ–΄ μ§‘λ‹ˆλ‹€. 이 κ²½μš°μ— 호좜 μ»¨ν…μŠ€νŠΈλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μž…λ‹ˆλ‹€. ν•¨μˆ˜ addTwoκ°€ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ ν˜ΈμΆœλ˜μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  11. μ§€κΈˆ 4단계 쀑 ν•œ 뢀뢄을 κ°€μ Έ μ˜΅λ‹ˆλ‹€. λ³€μˆ˜ bλŠ” λ°˜ν™˜λ˜μ–΄μ§„ κ°’ (숫자 5)λ₯Ό μ–»μ–΄ 할당이 λ©λ‹ˆλ‹€. μ—¬μ „νžˆ μž‘μ€ ν”„λ‘œκ·Έλž¨μ˜ 6행에 μžˆμŠ΅λ‹ˆλ‹€.
  12. μžμ„Ένžˆ μ„€λͺ…ν•˜μ§€λŠ” μ•Šμ§€λ§Œ 8ν–‰μ—μ„œ λ³€μˆ˜ b의 λ‚΄μš©μ΄ μ½˜μ†”μ— λ³΄μ—¬μ§‘λ‹ˆλ‹€. 이 μ˜ˆμ—μ„œλŠ” 숫자 5μž…λ‹ˆλ‹€.

맀우 κ°„λ‹¨ν•œ ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 맀우 κΈ΄ μ„€λͺ…μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 약속 λ“œλ¦½λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¨Όμ € λ‹€λ₯Έ μͺ½μ„ μ„€λͺ…ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ— λŒ€ν•΄ 일뢀λ₯Ό 이해할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ 예제 μ½”λ“œλ₯Ό λ΄…μ‹œλ‹€.

1: let val1 = 2
2: function multiplyThis(n) {
3:   let ret = n * val1
4:   return ret
5: }
6: let multiplied = multiplyThis(6)
7: console.log('example of scope:', multiplied)

이 μ•„μ΄λ””μ–΄λŠ” 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 그리고 μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œμ˜ λ³€μˆ˜λ₯Ό κ°€μ§‘λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ–΄λ €μš΄ 점은 λ³€μˆ˜λ₯Ό μ°ΎλŠ” κ²ƒμž…λ‹ˆλ‹€. λ§Œμ•½ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό 찾을 수 μ—†λ‹€λ©΄, 호좜 μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό 찾을 κ²ƒμž…λ‹ˆλ‹€. 그리고 λ§Œμ•½ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό 찾을 수 μ—†λ‹€λ©΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ 찾을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.(λ§Œμ•½ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ 찾을 수 μ—†λ‹€λ©΄ undefinedμž…λ‹ˆλ‹€.) μœ„μ˜ μ˜ˆμ œκ°€ λͺ…ν™•ν•©λ‹ˆλ‹€. λ§Œμ•½ μŠ€μ½”ν”„μ— λŒ€ν•΄μ„œ μ΄ν•΄ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ 이 뢀뢄은 μŠ€ν‚΅ν•΄λ„ λ©λ‹ˆλ‹€.

  1. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μƒˆλ‘œμš΄ λ³€μˆ˜ val1을 μ„ μ–Έν•˜κ³  숫자 2λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.
  2. 2ν–‰-5ν–‰. μƒˆλ‘œμš΄ λ³€μˆ˜ multiplyThisλ₯Ό μ„ μ–Έν•˜κ³  ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  3. 6ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μƒˆλ‘œμš΄ λ³€μˆ˜ multiplied을 μ„ μ–Έν•©λ‹ˆλ‹€.
  4. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ©”λͺ¨λ¦¬μ—μ„œ λ³€μˆ˜ multiplyThisλ₯Ό κ²€μƒ‰ν•˜μ—¬ ν•¨μˆ˜λ‘œ μ‹€ν–‰ν•˜κ³  숫자 6을 인자둜 μ „λ‹¬ν•©λ‹ˆλ‹€.
  5. μƒˆλ‘œμš΄ ν•¨μˆ˜ ν˜ΈμΆœμ€ μƒˆλ‘œμš΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μž…λ‹ˆλ‹€. μƒˆλ‘œμš΄ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 생성이 λ©λ‹ˆλ‹€.
  6. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜ n이 선언이 되고 숫자 6이 할당이 λ©λ‹ˆλ‹€.
  7. 3ν–‰. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜ ret이 선언이 λ©λ‹ˆλ‹€.
  8. 3ν–‰ (아직 진행쀑). 두 개의 μ—°μ‚°μžλ‘œ κ³±μ…ˆμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. λ³€μˆ˜ nκ³Ό val1. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ nλ³€μˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. 6λ‹¨κ³„μ—μ„œ 선언이 λ˜μ–΄ μ§‘λ‹ˆλ‹€. 이 본문은 숫자 6μž…λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ val1의 값을 μ°ΎμŠ΅λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” λ ˆμ΄λΈ”λœ val1을 가지고 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 호좜 μ»¨ν…μŠ€νŠΈλ₯Ό ν™•μΈν•©λ‹ˆλ‹€. 호좜 μ»¨ν…μŠ€νŠΈλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μž…λ‹ˆλ‹€. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ val1을 μ°ΎμŠ΅λ‹ˆλ‹€. μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.1λ‹¨κ³„λ‘œ μ •μ˜κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 값은 숫자 2μž…λ‹ˆλ‹€.
  9. 3ν–‰(아직 진행쀑). λ‘κ°œμ˜ μ—°μ‚°μžλ‘œ κ³±ν•˜κ³  ret λ³€μˆ˜μ— 할당을 ν•©λ‹ˆλ‹€.6 * 2 = 12. ret 은 12μž…λ‹ˆλ‹€.
  10. λ³€μˆ˜ ret이 λ°˜ν™˜μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” λ³€μˆ˜ retκ³Ό nκ³Ό ν•¨κ»˜ μ†Œλ©Έμ΄ λ©λ‹ˆλ‹€. λ³€μˆ˜ val1은 아직 μ†Œλ©Έλ˜μ§€ μ•Šμ•˜κ³ , μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ μΌλΆ€λΆ„μœΌλ‘œ 쑴재 ν•©λ‹ˆλ‹€.
  11. 6ν–‰μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€. 호좜 μ»¨ν…μŠ€νŠΈμ—μ„œ 숫자 12λŠ” multiplied λ³€μˆ˜μ— 할당이 λ©λ‹ˆλ‹€.
  12. λ§ˆμ§€λ§‰μœΌλ‘œ 7ν–‰, multiplied 의 λ³€μˆ˜κ°’μ΄ μ½˜μ†”μ— λ³΄μ—¬μ§‘λ‹ˆλ‹€.

λ”°λΌμ„œ 이 μ˜ˆμ œμ—μ„œλŠ” ν•¨μˆ˜κ°€ 호좜 μ»¨ν…μŠ€νŠΈμ— μ •μ˜ 된 λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμŒμ„ κΈ°μ–΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 것을 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λΌκ³  ν•©λ‹ˆλ‹€.

ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

첫번째 μ˜ˆμ œμ—μ„œλŠ” addTwo ν•¨μˆ˜κ°€ 숫자λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. In the first example the function addTwo returns a number. ν•¨μˆ˜λŠ” 무엇이든 λ°˜ν™˜ν•  수 μžˆλ‹€λŠ” 것을 κΈ°μ–΅ ν•˜μ„Έμš”. 이제 ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³ , ν΄λ‘œμ €λ₯Ό 이해할 수 μžˆλŠ” ν•„μˆ˜ 예제 μž…λ‹ˆλ‹€. λ‹€μŒμ€ 뢄석할 예제 μž…λ‹ˆλ‹€.

 1: let val = 7
 2: function createAdder() {
 3:   function addNumbers(a, b) {
 4:     let ret = a + b
 5:     return ret
 6:   }
 7:   return addNumbers
 8: }
 9: let adder = createAdder()
10: let sum = adder(val, 8)
11: console.log('example of function returning a function: ', sum)

λ‹¨κ³„λ³„λ‘œ 진행 ν•˜κ² μŠ΅λ‹ˆλ‹€.

  1. 1ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ³€μˆ˜ val이 선언이 λ˜μ–΄μ§€κ³  숫자 7이 할당이 λ˜μ–΄ μ§‘λ‹ˆλ‹€.
  2. 2행–8ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— createAdderμ΄λ¦„μœΌλ‘œ 선언이 λ˜μ–΄μ§€κ³ , μ •μ˜ν•œ ν•¨μˆ˜κ°€ 할당이 λ˜μ–΄ μ§‘λ‹ˆλ‹€. 3ν–‰μ—μ„œ 7행은 ν•¨μˆ˜ μ •μ˜λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. κ·Έ 전에 이 λΆ€λΆ„μ—μ„œ ν•¨μˆ˜λ‘œ λ„˜μ–΄ 가지 μ•ŠμŠ΅λ‹ˆλ‹€. λ³€μˆ˜ (createAdder)에 μ •μ˜λœ ν•¨μˆ˜κ°€ μ €μž₯이 λ˜μ–΄ μ§‘λ‹ˆλ‹€.
  3. 9ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— adder이름을 가진 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 일반적으둜 adder에 undefinedκ°€ 할당이 λ©λ‹ˆλ‹€.
  4. μ—¬μ „νžˆ 9ν–‰. ();을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€ν–‰ λ˜λŠ” ν•¨μˆ˜ 호좜이 ν•„μš” ν•©λ‹ˆλ‹€. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ©”λͺ¨λ¦¬μ— 질의λ₯Ό ν•˜κ³  createAdder이름을 가진 λ³€μˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. 이것은 2λ‹¨κ³„μ—μ„œ 생성이 λ˜μ–΄ μ§‘λ‹ˆλ‹€. 그리고 호좜이 λ©λ‹ˆλ‹€.
  5. ν•¨μˆ˜ 호좜. 2ν–‰μ—μ„œ. μƒˆλ‘œμš΄ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 생성이 λ˜μ–΄μ§‘λ‹ˆλ‹€. μƒˆλ‘œμš΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ 지역 λ³€μˆ˜κ°€ λ§Œλ“€μ–΄ μ§‘λ‹ˆλ‹€. 엔진은 μ½œμŠ€νƒμ— μƒˆλ‘œμš΄ μ»¨ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ ν•©λ‹ˆλ‹€. ν•¨μˆ˜λŠ” 인사λ₯Ό 가지고 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜κ³  본문으둜 λ“€μ–΄κ°‘λ‹ˆλ‹€.
  6. μ—¬μ „νžˆ 3-6ν–‰. μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— addNumbers λ³€μˆ˜λ‘œ μƒμ„±ν•©λ‹ˆλ‹€. 이 뢀뢄이 μ€‘μš” ν•©λ‹ˆλ‹€. addNumbersλŠ” 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ ν•˜λ‚˜λ§Œ 쑴재 ν•©λ‹ˆλ‹€.addNumbers이름을 가진 지역 λ³€μˆ˜μ—μ„œ ν•¨μˆ˜κ°€ μ •μ˜λœ 것이 μ €μž₯λ©λ‹ˆλ‹€.
  7. 7ν–‰. addNumbers의 λ³€μˆ˜μ— 본문이 λ°˜ν™˜λ©λ‹ˆλ‹€. 엔진은 addNumbers의 λ³€μˆ˜λ₯Ό μ°Ύκ³ , μ°ΎμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό μ •μ˜ ν•©λ‹ˆλ‹€. μ’‹μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•œ 것을 ν¬ν•¨ν•˜κ³  κ·Έ μ–΄λŠκ²ƒμ„ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ addNumbers의 μ •μ˜ν•œ 것을 λ°˜ν™˜ν•©λ‹ˆλ‹€. {} 사이에 μžˆλŠ” 것을 ν•¨μˆ˜ μ •μ˜λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.λ˜ν•œ 호좜 μŠ€νƒμ—μ„œ 둜컬 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό 제거 ν•©λ‹ˆλ‹€.
  8. λ°˜ν™˜ (return)ν•˜λ©΄ 둜컬 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‚­μ œ λ©λ‹ˆλ‹€.addNumbers λ³€μˆ˜λŠ” 더 이상 μ—†μŠ΅λ‹ˆλ‹€. μ •μ˜ν•œ ν•¨μˆ˜λŠ” μ—¬μ „νžˆ μ‘΄μž¬ν•˜μ§€λ§Œ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ˜λ©° 'addr'에 ν• λ‹Ήλ©λ‹ˆλ‹€. 이것은 3λ‹¨κ³„μ—μ„œ λ³€μˆ˜κ°€ 생성이 λ©λ‹ˆλ‹€.
  9. 10ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μƒˆλ‘œμš΄ λ³€μˆ˜ sum이 μ •μ˜ ν•©λ‹ˆλ‹€. 일반적으둜 undefined을 ν• λ‹Ήν•©λ‹ˆλ‹€.
  10. λ‹€μŒμ— ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€. μ–΄λ–€ ν•¨μˆ˜? addrλΌλŠ” λ³€μˆ˜μ— μ •μ˜λœ ν•¨μˆ˜. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μΆ©λΆ„νžˆ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. 두 가지 νŒŒλΌλ―Έν„°λ₯Ό μ·¨ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
  11. 두 개의 νŒŒλΌλ―Έν„°λ₯Ό κ²€μƒ‰ν•˜μ—¬ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , μ˜¬λ°”λ₯Έ 인자λ₯Ό 전달 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ²«λ²ˆμ§ΈλŠ” 1λ‹¨κ³„μ—μ„œ μ •μ˜ν•œ λ³€μˆ˜ val이며 μˆ«μžλŠ” 7이고 λ‘λ²ˆμ§Έ 숫자 8μž…λ‹ˆλ‹€.
  12. 이제 이 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€. ν•¨μˆ˜ μ •μ˜λŠ” 3-5ν–‰μ—μ„œ μš”μ•½μ΄ λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ 둜컬 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ©λ‹ˆλ‹€. 둜컬 μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ 두 개의 μƒˆλ‘œμš΄ λ³€μˆ˜μΈ a와 bκ°€ λ§Œλ“€μ–΄ μ§‘λ‹ˆλ‹€. 이전 λ‹¨κ³„μ—μ„œ ν•¨μˆ˜μ— 전달 인수 μ΄λ―€λ‘œ 7및 8값이 ν• λ‹Ή λ©λ‹ˆλ‹€.
  13. 4ν–‰. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μƒˆλ‘œμš΄ λ³€μˆ˜ ret을 μ„ μ–Έν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  14. 4ν–‰. λ³€μˆ˜ a의 λ‚΄μš©κ³Ό λ³€μˆ˜ b의 λ‚΄μš©μ„ 더해지고, 싀행이 λ©λ‹ˆλ‹€. ret λ³€μˆ˜μ— 더해진 결과인 15κ°€ 할당이 λ˜μ–΄ μ§‘λ‹ˆλ‹€.
  15. retλ³€μˆ˜λŠ” ν•¨μˆ˜λ‘œ λΆ€ν„° λ°˜ν™˜μ΄ λ˜μ–΄ μ§‘λ‹ˆλ‹€. 둜컬 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ†Œλ©Έμ΄ 되고, 이것은 μ½œμŠ€νƒ, λ³€μˆ˜ a, λ³€μˆ˜ b, ret은 더 이상 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  16. λ°˜ν™˜κ°’μ€ 9λ‹¨κ³„μ—μ„œ μ •μ˜ν•œ sumλ³€μˆ˜μ— ν• λ‹Ήλ©λ‹ˆλ‹€.
  17. μ½˜μ†”μ—μ„œ sum의 값이 좜λ ₯이 λ©λ‹ˆλ‹€.

μ˜ˆμƒ λŒ€λ‘œ μ½˜μ†”μ— 15κ°€ 좜λ ₯이 될 κ²ƒμž…λ‹ˆλ‹€. μ‹€μ œλ‘œ λ§Žμ€ 일이 λ²Œμ–΄μ§‘λ‹ˆλ‹€. μ—¬κΈ°μ„œ λͺ‡ 가지 μš”μ μ„ μ„€λͺ…ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 첫번째, ν•¨μˆ˜ μ •μ˜λŠ” λ³€μˆ˜μ— μ €μž₯될 수 있으며, ν•¨μˆ˜ μ •μ˜λŠ” 호좜될 λ•Œ κΉŒμ§€ ν”„λ‘œκ·Έλž¨μ— 보이지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‘˜μ§Έ, ν•¨μˆ˜κ°€ 호좜되 λ•Œλ§ˆλ‹€ 둜컬 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ (μΌμ‹œμ μœΌλ‘œ) μƒμ„±λ©λ‹ˆλ‹€. ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” κΈ°λŠ₯이 μ™„λ£Œλ˜λ©΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. ν•¨μˆ˜λŠ” returnλ˜λŠ” λ‹«λŠ” κ΄„ν˜Έ }κ°€ μžˆμ„ λ•Œ μˆ˜ν–‰λ©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰, ν΄λ‘œμ €

λ‹€μŒ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ³  μ–΄λ–€ 일이 일어날 지 μ•Œμ•„λ³΄μ‹­μ‹œμ˜€.

 1: function createCounter() {
 2:   let counter = 0
 3:   const myFunction = function() {
 4:     counter = counter + 1
 5:     return counter
 6:   }
 7:   return myFunction
 8: }
 9: const increment = createCounter()
10: const c1 = increment()
11: const c2 = increment()
12: const c3 = increment()
13: console.log('example increment', c1, c2, c3)

이전 두 μ˜ˆμ œμ—μ„œλ‹€λ£¨μ—ˆμœΌλ―€λ‘œ 이제 μ‹€ν–‰λœ κ²°κ³Όλ₯Ό μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. 1행–8ν–‰. μƒˆλ‘œμš΄ λ³€μˆ˜ createCounter을 μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μƒμ„±ν•˜κ³ , μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.
  2. 9ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— increment이름을 가진 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.
  3. λ‹€μ‹œ 9ν–‰. creteCounterν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  ν•„μš”κ°€ 있고, incrementλ³€μˆ˜μ˜ 값을 ν• λ‹Ήν•©λ‹ˆλ‹€.
  4. 1행–8ν–‰. 호좜 ν•¨μˆ˜. μƒˆλ‘œμš΄ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  5. 2ν–‰. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μ•ˆμ—μ„œ, counter 이름을 가진 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. counter에 숫자 9κ°€ 할당이 λ˜μ–΄ μ§‘λ‹ˆλ‹€.
  6. 3행–6ν–‰. myFunction이름ㅇλ₯΄ 가진 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. λ³€μˆ˜λŠ” 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— 선언이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜μ˜ 본문은 아직 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ •μ˜ ν•©λ‹ˆλ‹€. 4ν–‰κ³Ό 5ν–‰μ—μ„œ μ •μ˜λ₯Ό ν•©λ‹ˆλ‹€.
  7. 7ν–‰. myFunction λ³€μˆ˜μ˜ 본문은 λ°˜ν™˜μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‚­μ œλ˜μ–΄ μ§‘λ‹ˆλ‹€. myFunction 그리고 counterλŠ” 더 이상 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 호좜 μ»¨ν…μŠ€νŠΈμ—μ„œ λ°˜ν™˜ λ˜λŠ” 것을 μ œμ–΄ν•©λ‹ˆλ‹€.
  8. 9ν–‰. 호좜 μ»¨ν…μŠ€νŠΈ, μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ, 값은 createCounter에 μ˜ν•΄ λ°˜ν™˜μ΄ 되고 incrementκ°€ 할당이 λ˜μ–΄ μ§‘λ‹ˆλ‹€. λ³€μˆ˜λŠ” μ¦κ°€ν•˜κ³  ν•¨μˆ˜ μ •μ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. createCounter에 μ˜ν•΄ λ°˜ν™˜μ΄ λ˜μ–΄μ§„ ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. λ ˆμ΄λΈ”λœ myFunction이 쑴재 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 같은 ν•¨μˆ˜ μ •μ˜λ₯Ό ν•©λ‹ˆλ‹€. κΈ€λ‘œλ²Œ μ»¨ν…μŠ€νŠΈμ—μ„œ, 그것은 increment둜 λ ˆμ΄λΈ”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  9. 10ν–‰. μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.(c1)
  10. 10ν–‰(아직 진행). increment λ³€μˆ˜λ₯Ό μ°ΎμœΌλ‹ˆ ν•¨μˆ˜ μž…λ‹ˆλ‹€. 4-5행에 μ •μ˜ λœλŒ€λ‘œ 이전에 λ°˜ν™˜λœ ν•¨μˆ˜ μ •μ˜κ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
  11. μƒˆλ‘œμš΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. νŒŒλΌλ―Έν„°λ“€μ΄ μ—†μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.
  12. 4ν–‰. counter = counter + 1. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ counterλ³€μˆ˜λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. 이 μ»¨ν…μŠ€νŠΈλ₯Ό λ§Œλ“€μ—ˆκ³  지역 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. counter둜 λ ˆμ΄λΈ”λœ λ³€μˆ˜λŠ” 이곳에 μ—†μŠ΅λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” counter = undefined +1을 계산할 것이고, counter둜 λ ˆμ΄λΈ”λœ μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  숫자 1을 ν• λ‹Ήν•˜κ³  undefined은 0κ³Ό 같은 숫자λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.
  13. 5ν–‰. counter의 본문을 λ¦¬ν„΄ν•˜κ±°λ‚˜ 숫자 1을 λ¦¬ν„΄ν•©λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ, counter λ³€μˆ˜κ°€ μ†Œλ©Έ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  14. 10ν–‰μœΌλ‘œ 리턴이 λ©λ‹ˆλ‹€. λ¦¬ν„΄λœ κ°’(1)은 c1에 ν• λ‹Ήν•œ 것을 μ–»μŠ΅λ‹ˆλ‹€.
  15. 11ν–‰. 10-14 단계λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€. c2λŠ” λ˜ν•œ 1을 μ–»μŠ΅λ‹ˆλ‹€.
  16. 12ν–‰. 10-14 단계λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€. c3λŠ” λ˜ν•œ 1을 μ–»μŠ΅λ‹ˆλ‹€.
  17. 13ν–‰. c1, c2, c3의 λ³€μˆ˜μ˜ 본문이 둜그둜 좜λ ₯ λ©λ‹ˆλ‹€.

각 λΆ€λΆ„μ—μ„œ μ–΄λ–€ 일이 λ°œμƒν•˜λŠ”μ§€ ν•œλ²ˆ μ‚΄νŽ΄λ³΄μ„Έμš”. μœ„ μ„€λͺ…μ—μ„œ μ•Œμˆ˜ μžˆλ“―μ΄ 1, 1, 1둜 μ½˜μ†”μ— 보여 지지 μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹ μ— 1, 2, 3이 μ½˜μ†”μ— λ³΄μ—¬μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ 무엇을 μ£Όλ‚˜μš”?

μ–΄μ¨Œλ“  증가 ν•¨μˆ˜λŠ” μΉ΄μš΄ν„° 값을 κΈ°μ–΅ ν•©λ‹ˆλ‹€. μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜μš”?

counterλŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμΈκ°€μš”? console.log(counter)을 μž…λ ₯ν•˜λ©΄ undefined을 얻을 κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ•„λ‹™λ‹ˆλ‹€.

μ•„λ§ˆλ„ increment을 ν˜ΈμΆœν•˜λ©΄ μ–΄λ–»κ²Œλ“  incrementκ°€ μƒμ„±λœ ν•¨μˆ˜(createCounter)둜 λŒμ•„κ°‘λ‹ˆλ‹€. μ–΄λ–»κ²Œ μž‘λ™ν• κΉŒμš”? incrementλ³€μˆ˜λŠ” ν•¨μˆ˜ μ •μ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ‹€λ₯Έ λ©”μ»€λ‹ˆμ¦˜μ΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. ν΄λ‘œμ €. μžƒμ–΄λ²„λ¦° 쑰각에 도착 ν–ˆμŠ΅λ‹ˆλ‹€.

μž‘λ™ 방식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  λ³€μˆ˜μ— ν• λ‹Ήν•  λ•Œλ§ˆλ‹€ ν•¨μˆ˜ μ •μ˜μ™€ ν΄λ‘œμ €λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” ν•¨μˆ˜ 생성 μ‹œ μŠ€μ½”ν”„ 내에 μžˆλŠ” λͺ¨λ“  λ³€μˆ˜κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. λ°°λ‚­κ³Ό λΉ„μŠ·ν•©λ‹ˆλ‹€. ν•¨μˆ˜ μ •μ˜λŠ” μž‘μ€ λ°°λ‚­κ³Ό ν•¨κ»˜ μ œκ³΅λ©λ‹ˆλ‹€. 그리고 νŒ©μ—λŠ” ν•¨μˆ˜ μ •μ˜κ°€ μž‘μ„±λ  λ•Œ λ²”μœ„ 내에 있던 λͺ¨λ“  λ³€μˆ˜κ°€ μ €μž₯λ©λ‹ˆλ‹€.

μœ„μ˜ μ„€λͺ…은 λͺ¨λ‘ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” λ‹€μ‹œ μ‹œλ„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1: function createCounter() {
 2:   let counter = 0
 3:   const myFunction = function() {
 4:     counter = counter + 1
 5:     return counter
 6:   }
 7:   return myFunction
 8: }
 9: const increment = createCounter()
10: const c1 = increment()
11: const c2 = increment()
12: const c3 = increment()
13: console.log('example increment', c1, c2, c3)
  1. 1행–8ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ createCounter μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 그리고 ν•¨μˆ˜ μ •μ˜λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€. μœ„μ™€ 동일 ν•©λ‹ˆλ‹€.
  2. 9ν–‰. increment 이름을 가진 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— μ„ μ–Έν•©λ‹ˆλ‹€. μœ„μ™€ λ™μΌν•©λ‹ˆλ‹€.
  3. λ‹€μ‹œ 9ν–‰. createCounter ν•¨μˆ˜ ν˜ΈμΆœμ„ ν•„μš”λ‘œν•˜κ³ , increment λ³€μˆ˜μ˜ 값을 ν• λ‹Ήν•©λ‹ˆλ‹€. μœ„μ™€ λ™μΌν•©λ‹ˆλ‹€.
  4. 1행–8ν–‰ . ν•¨μˆ˜μ˜ 호좜. μƒˆλ‘œμš΄ 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μœ„μ™€ 동일 ν•©λ‹ˆλ‹€.
  5. 2ν–‰. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€μ—μ„œ, counter이름을 가진 λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 숫자 0은 counter에 ν• λ‹Ήλ©λ‹ˆλ‹€. μœ„μ™€ λ™μΌν•©λ‹ˆλ‹€.
  6. 3행–6ν–‰. myFunction이름을 가진 λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ— λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. λ³€μˆ˜μ˜ 본문은 아직 λ‹€λ₯Έ ν•¨μˆ˜ μ •μ˜μ— μžˆμŠ΅λ‹ˆλ‹€. 4ν–‰μ—μ„œ 5행에 μ •μ˜λœ λŒ€λ‘œ 이제 ν΄λ‘œμ € 그리고 ν•¨μˆ˜ μ •μ˜λ₯Ό μΌλΆ€λ‘œ 포함이 λ©λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” λ²”μœ„ 내에 μžˆλŠ” λ³€μˆ˜, 이 경우 counter을 ν¬ν•¨ν•©λ‹ˆλ‹€. (κ°’ 0κ³Ό ν•¨κ»˜).
  7. 7ν–‰. myFunction λ³€μˆ˜μ˜ 본문을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‚­μ œλ©λ‹ˆλ‹€. myFunction 그리고 counter은 더 이상 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ œμ–΄λŠ” 호좜 μ»¨ν…μŠ€νŠΈλ‘œ λ¦¬ν„΄λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ ν•¨μˆ˜ μ •μ˜μ™€ ν΄λ‘œμ €λ₯Ό, 이것이 생성 λ˜μ—ˆμ„ λ•Œ μŠ€μ½”ν”„μ—μ„œ 백팩과 λ³€μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  8. 9ν–‰. μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμΈ 호좜 μ»¨ν…μŠ€νŠΈμ—μ„œ createCounter에 μ˜ν•΄ λ°˜ν™˜λœ 값은 increment에 할당이 λ˜μ–΄ μ§‘λ‹ˆλ‹€. λ³€μˆ˜ incrementλŠ” ν•¨μˆ˜ μ •μ˜μ™€ ν΄λ‘œμ €κ°€ 포함이 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. createCounter에 λ°˜ν™˜λ˜μ–΄μ§„ ν•¨μˆ˜λ₯Ό μ •μ˜ ν•©λ‹ˆλ‹€. 더 이상 myFunction이라고 ν‘œμ‹œλ˜μ§€ μ•Šμ§€λ§Œ 같은 μ •μ˜ μž…λ‹ˆλ‹€. κΈ€λ‘œλ²Œ μ»¨ν…μŠ€νŠΈμ—μ„œ incrementκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  9. 10ν–‰. μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€(c1).
  10. 10ν–‰ (계속 진행). incrementλ³€μˆ˜λ₯Ό 찾아보면 ν•¨μˆ˜ μž…λ‹ˆλ‹€. 4-5행에 μ •μ˜λœ λŒ€λ‘œ 이전에 λ°˜ν™˜λœ ν•¨μˆ˜ μ •μ˜λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.(그리고 이것 λ˜ν•œ 백팩과 λ³€μˆ˜λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.)
  11. μƒˆλ‘œμš΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. νŒŒλΌλ―Έν„°λ₯Ό 가지고 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜μ˜ 싀행을 μ‹œμž‘ν•©λ‹ˆλ‹€.
  12. 4ν–‰. counter = counter + 1.counterλ³€μˆ˜λ₯Ό μ°ΎλŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€. 지역 λ˜λŠ” μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ°ΎκΈ° 전에, λ°±νŒ©μ— μ°Ύμ•„λ΄…λ‹ˆλ‹€. ν΄λ‘œμ €λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. Lo 그리고 behold, ν΄λ‘œμ €λŠ” counter이름을 가진 λ³€μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  있고 값은 0 μž…λ‹ˆλ‹€. 4ν–‰μ—μ„œμ˜ ν‘œν˜„μ‹ 이후 값은 1이 μ…‹νŒ…μ΄ λ˜μ–΄ μ§‘λ‹ˆλ‹€. 그리고 λ°±νŒ©μ— λ‹€μ‹œ μ €μž₯이 λ©λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” μ§€κΈˆ λ³€μˆ˜counter 그리고 값은 1을 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  13. 5ν–‰. counter의 λ³Έλ¬Έ λ˜λŠ” 숫자 1을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 지역 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ†Œλ©Έλ©λ‹ˆλ‹€.
  14. 10ν–‰μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€. λ°˜ν™˜λœ κ°’ 1은 c1에 ν• λ‹Ήλ©λ‹ˆλ‹€.
  15. 11ν–‰. 10λ‹¨κ³„μ—μ„œ λΆ€ν„° 14λ‹¨κ³„κΉŒμ§€λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” ν΄λ‘œμ €λ₯Ό 보면 counterλ³€μˆ˜μ˜ 값이 1μ΄λΌλŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ˜ 12단계 λ˜λŠ” 4ν–‰μ—μ„œ 섀정이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έκ²ƒμ˜ 값은 증가 ν•¨μˆ˜μ˜ ν΄λ‘œμ €μ—μ„œ μ¦κ°€ν•˜κ³  2둜 μ €μž₯이 λ©λ‹ˆλ‹€. 그리고 c2μ—λŠ” 2κ°€ ν• λ‹Ήλ©λ‹ˆλ‹€.
  16. 12ν–‰. 10λ‹¨κ³„μ—μ„œ 14λ‹¨κ³„κΉŒμ§€λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€. c3은 3이 ν• λ‹Ήλ©λ‹ˆλ‹€.
  17. 13ν–‰. c1, c2, c3 λ³€μˆ˜μ˜ 본문이 μ½˜μ†”μ— λ³΄μ—¬μ§‘λ‹ˆλ‹€.

이제 이것이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°μ–΅ν•΄μ•Όν•  핡심은 ν•¨μˆ˜κ°€ 선언될 λ•Œ ν•¨μˆ˜ μ •μ˜μ™€ ν΄λ‘œμ €λ₯Ό ν¬ν•¨ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” ν•¨μˆ˜ 생성 μ‹œ λ²”μœ„μ— μžˆλŠ” λͺ¨λ“  λ³€μˆ˜μ˜ λͺ¨μŒμž…λ‹ˆλ‹€.

μ „μ—­ λ²”μœ„μ—μ„œ μž‘μ„±λœ ν•¨μˆ˜ 쑰차도 μ–΄λ–€ ν•¨μˆ˜μ— ν΄λ‘œμ €κ°€ μžˆμŠ΅λ‹ˆκΉŒ? λŒ€λ‹΅μ€ μ˜ˆμž…λ‹ˆλ‹€. μ „μ—­ λ²”μœ„μ—μ„œ μƒμ„±λœ ν•¨μˆ˜λŠ” ν΄λ‘œμ €λ₯Ό λ§Œλ“­λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ ν•¨μˆ˜λŠ” μ „μ—­ λ²”μœ„μ—μ„œ μž‘μ„± λ˜μ—ˆμœΌλ―€λ‘œ μ „μ—­ λ²”μœ„μ˜ λͺ¨λ“  λ³€μˆ˜μ— μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λ‘œμ € κ°œλ…μ€ μ‹€μ œλ‘œ 관련이 μ—†μŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•  λ•Œ, 즉 ν΄λ‘œμ € κ°œλ…μ΄ 더 관련성이 더 λ†’μ•„μ§‘λ‹ˆλ‹€. λ°˜ν™˜λœ ν•¨μˆ˜λŠ” μ „μ—­ λ²”μœ„μ— μ—†λŠ” λ³€μˆ˜μ— μ•‘μ„ΈμŠ€ ν•  수 μžˆμ§€λ§Œ ν΄λ‘œμ €μ—λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

μ‚¬μ†Œν•œ ν΄λ‘œμ €λŠ” μ•„λ‹™λ‹ˆλ‹€.

눈치 채지 λͺ»ν•  λ•Œλ„ μ’…μ’… ν΄λ‘œμ €κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. λΆ€λΆ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λΌκ³  ν•˜λŠ” 예제λ₯Ό 보셨을 κ²ƒμž…λ‹ˆλ‹€. λ‹€μŒ μ½”λ“œμ™€ 같이.

let c = 4
const addX = x => n => n + x
const addThree = addX(3)
let d = addThree(c)
console.log('example partial application', d)

ν™”μ‚΄ν‘œ ν•¨μˆ˜μΈ κ²½μš°κ°€ 여기에 ν•΄λ‹Ή ν•©λ‹ˆλ‹€.

let c = 4
function addX(x) {
  return function(n) {
     return n + x
  }
}
const addThree = addX(3)
let d = addThree(c)
console.log('example partial application', d)

ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜ (x)λ₯Ό μ‚¬μš©ν•˜κ³  λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” 일반 addrν•¨μˆ˜ addXλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

λ¦¬ν„΄λœ ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ 맀개 λ³€μˆ˜λ₯Ό 가지고 μ™€μ„œ λ³€μˆ˜ x에 μΆ”κ°€ν•©λ‹ˆλ‹€.

λ³€μˆ˜ xλŠ” ν΄λ‘œμ €μ˜ 일뢀 μž…λ‹ˆλ‹€. 'addThree' λ³€μˆ˜κ°€ 지역 μ»¨ν…μŠ€νŠΈμ—μ„œ μ„ μ–Έλ˜λ©΄ ν•¨μˆ˜ μ •μ˜μ™€ ν΄λ‘œμ €κ°€ ν• λ‹Ήλ©λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” λ³€μˆ˜ xλ₯Ό ν¬ν•©ν•©λ‹ˆλ‹€.

이제 addThreeκ°€ ν˜ΈμΆœλ˜μ–΄ 싀행될 λ•Œ, λ³€μˆ˜λŠ” ν΄λ‘œμ €μ—μ„œ λ³€μˆ˜ x와 인자둜 μ „λ‹¬λœ λ³€μˆ˜ n에 μ•‘μ„ΈμŠ€ ν•  수 있으며 sum을 리턴할 수 μžˆμŠ΅λ‹ˆλ‹€.

이 μ˜ˆμ œμ—μ„œ μ½˜μ†”μ€ 숫자 7을 μΈμ‡„ν•©λ‹ˆλ‹€.

img

img

κ²°λ‘ 

ν΄λ‘œμ €λ₯Ό κΈ°μ–΅ν•˜λŠ” 방법은 λ°°λ‚­ λΉ„μœ λ₯Ό ν†΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§€κ³  λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ μ „λ‹¬λ˜κ±°λ‚˜ λ°˜ν™˜λ˜λ©΄ λ°°λ‚­κ³Ό ν•¨κ»˜ 배낭을 μš΄λ°˜ν•©λ‹ˆλ‹€. 그리고 λ°°λ‚­μ—λŠ” ν•¨μˆ˜κ°€ μ„ μ–Έ λ˜μ—ˆμ„ λ•Œ μŠ€μ½”ν”„ 내에 있던 λͺ¨λ“  λ³€μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ 이 글이 즐거웠닀면 λ°•μˆ˜λ₯Ό μžŠμ§€ λ§ˆμ„Έμš”. πŸ‘ κ°μ‚¬ν•©λ‹ˆλ‹€.