πŸŒ†
Sunset Archive
GitHubLinkedInBlog
  • litsynp
  • Archives
    • Projects
      • Let's Parking!
      • λ§›μ§‘λͺ¬μŠ€ν„° (JMT Monster)
      • spring-x-demo Projects
    • Articles
      • My Thoughts on GitBook
      • Wake-on-LAN & RDP Setup
    • Learning
      • Languages
        • Rust
          • Useful Links
          • Syntax
          • Pointers
          • Dependencies
          • Logging
          • Phantom Types
          • Iterable
            • Optional Skip
        • Go
          • Useful Links
          • Structures
          • Zero Values
          • Error Handling
          • Dependency Injection
          • Project Layout
        • JavaScript/TypeScript
          • Basics
            • Types
              • [JS] Falsy Values
              • [TS] Types - unknown, any, never
            • Rest Parameters (...)
            • Spread Syntax (...)
            • Destructuing Assignment
            • CJS, AMD, UMD, ESM
          • Advanced
            • Conditional Destructuring Assignment
            • Type Guards
          • Miscellaneous
            • Dependency Injection in JS?
            • ESLint, Prettier, TypeScript
          • Node
            • Useful Links
            • General
              • V8 Engine
              • Version Management: NVM
              • Environment Variables
            • Database
              • Knex
        • C
          • Dynamic Multi-dimensional Arrays
        • Spring
          • General
            • @Import v.s. @ContextConfiguration
            • MessageSource
          • Kotlin+Spring
            • Kotlin Annotations (Use-Site Targets)
            • Handling Null in Request DTO
            • Handling Null in URL
          • Reactive Stack
            • Reactive API with Spring WebFlux
          • Spring Security
            • Google OAuth Setup
          • Spring Batch
            • Bulk Insert
        • Kotlin
          • val/var in Constructor
          • Initializer Blocks
          • Inheritance Modifiers (final, open, abstract)
          • Delegate Pattern
        • Java
          • Serialization
          • Random Number Generation
            • (1) Math.random() v.s. Random
            • (2) Random v.s. ThreadLocalRandom
        • Python
          • Version Management
        • Ruby
          • Installation
          • Getters & Setters
        • Elixir
        • Erlang
        • Flutter
        • AWS
          • AWS CLI
        • Terraform
          • Installation
          • Basics
      • Code
        • OOP
          • The 4 Basic Concepts of OOP
          • The SOLID Principles
          • GRASP
          • Spring POJO
          • Others
        • Functional Programming
          • Currying
          • Higher-Order Function
          • Closure
          • Monad
        • 곡변성, λ°˜κ³΅λ³€μ„±, 무곡변성
        • Others
          • UUID
          • GraphQL
          • Multimedia
            • Streaming
          • Geography
            • μœ„λ„ (Latitude), 경도 (Longitude)
      • Tools
        • Nix
        • Mermaid
          • Flowchart
          • Sequence Diagram
          • Class Diagram
          • Entity Relationship Diagrams
        • VSCode
          • VSCode CLI
          • VSCode Extensions
        • JetBrains
          • IntelliJ - Open Projects in Tabs
          • Delete Leftover IDE Directories
        • vim
          • Commands
      • Books
        • λ‹€μž¬λ‹€λŠ₯ μ½”ν‹€λ¦° ν”„λ‘œκ·Έλž˜λ° (Programming Kotlin)
          • Pt 01. μ½”ν‹€λ¦°μœΌλ‘œ μŠ€ν¬λ¦½νŒ… ν•˜κΈ°
            • Ch 01. μ½”ν‹€λ¦° μ‹œμž‘ν•˜κΈ°
            • Ch 02. Java 개발자λ₯Ό μœ„ν•œ μ½”ν‹€λ¦° ν•„μˆ˜ 사항
            • Ch 03. ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μž
            • Ch 05. μ½œλ ‰μ…˜ μ‚¬μš©ν•˜κΈ°
        • 였브젝트 (Object)
          • Ch.0 λ“€μ–΄κ°€λ©° - ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
          • Ch.1 객체, 섀계
          • Ch.2 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°
          • Ch.3 μ—­ν• , μ±…μž„, ν˜‘λ ₯
          • Ch.4 섀계 ν’ˆμ§ˆκ³Ό νŠΈλ ˆμ΄λ“œμ˜€ν”„
          • Ch.5 μ±…μž„ ν• λ‹Ήν•˜κΈ°
          • Ch.6 λ©”μ‹œμ§€μ™€ μΈν„°νŽ˜μ΄μŠ€
          • Ch.7 μœ μ—°ν•œ 섀계
          • Ch.8 μ˜μ‘΄μ„± κ΄€λ¦¬ν•˜κΈ°
          • Ch.9 μœ μ—°ν•œ 섀계
          • Ch.10 상속과 μ½”λ“œ μž¬μ‚¬μš©
          • Ch.11 ν•©μ„±κ³Ό μœ μ—°ν•œ 섀계
          • Ch.12 λ‹€ν˜•μ„±
          • Ch.13 μ„œλΈŒν΄λž˜μ‹±κ³Ό μ„œλΈŒνƒ€μ΄ν•‘
          • Ch.14 일관성 μžˆλŠ” ν˜‘λ ₯
          • Ch.15 λ””μžμΈ νŒ¨ν„΄κ³Ό ν”„λ ˆμž„μ›Œν¬
          • End. 마치며 - λ‚˜μ•„κ°€κΈ°
          • ν›„κΈ°
        • ν—€λ“œ 퍼슀트 λ””μžμΈ νŒ¨ν„΄ (Head First Design Patterns)
          • Ch.1 λ””μžμΈ νŒ¨ν„΄ μ†Œκ°œμ™€ μ „λž΅ νŒ¨ν„΄
          • Ch.2 μ˜΅μ €λ²„ νŒ¨ν„΄
          • Ch.3 λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄
          • Ch.4 νŒ©ν† λ¦¬ νŒ¨ν„΄
          • Ch.5 μ‹±κΈ€ν„΄ νŒ¨ν„΄
          • Ch.6 μ»€λ§¨λ“œ νŒ¨ν„΄
          • Ch.7 μ–΄λŒ‘ν„° νŒ¨ν„΄κ³Ό νΌμ‚¬λ“œ νŒ¨ν„΄
          • Ch.8 ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄
          • Ch.9 반볡자 νŒ¨ν„΄κ³Ό μ»΄ν¬μ§€νŠΈ νŒ¨ν„΄
          • Ch.10 μƒνƒœ νŒ¨ν„΄
          • Ch.11 ν”„λ‘μ‹œ νŒ¨ν„΄
          • Ch.12 볡합 νŒ¨ν„΄
        • μ΄νŽ™ν‹°λΈŒ νƒ€μž…μŠ€ν¬λ¦½νŠΈ (Effective TypeScript)
          • Ch.1 νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ•Œμ•„λ³΄κΈ°
            • Item 1 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 관계 μ΄ν•΄ν•˜κΈ°
            • Item 2 νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ„€μ • μ΄ν•΄ν•˜κΈ°
            • Item 3 μ½”λ“œ 생성과 νƒ€μž…μ΄ κ΄€κ³„μ—†μŒμ„ μ΄ν•΄ν•˜κΈ°
            • Item 4 ꡬ쑰적 타이핑에 μ΅μˆ™ν•΄μ§€κΈ°
            • Item 5 any νƒ€μž… μ§€μ–‘ν•˜κΈ°
          • Ch.2 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž… μ‹œμŠ€ν…œ
            • Item 6 νŽΈμ§‘κΈ°λ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž… μ‹œμŠ€ν…œ νƒμƒ‰ν•˜κΈ°
            • Item 7 νƒ€μž…μ΄ κ°’λ“€μ˜ 집합이라고 μƒκ°ν•˜κΈ°
            • Item 1-7 Study Summary
            • Item 8 νƒ€μž… 곡간과 κ°’ κ³΅κ°„μ˜ μ‹¬λ²Œ κ΅¬λΆ„ν•˜κΈ°
            • Item 9 νƒ€μž… λ‹¨μ–Έλ³΄λ‹€λŠ” νƒ€μž… 선언을 μ‚¬μš©ν•˜κΈ°
            • Item 10 객체 래퍼 νƒ€μž… ν”Όν•˜κΈ°
            • Item 11 μž‰μ—¬ 속성 체크의 ν•œκ³„ μΈμ§€ν•˜κΈ°
            • Item 12 ν•¨μˆ˜ ν‘œν˜„μ‹μ— νƒ€μž… μ μš©ν•˜κΈ°
            • Item 13 νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ 차이점 μ•ŒκΈ°
            • Item 14 νƒ€μž… μ—°μ‚°κ³Ό μ œλ„ˆλ¦­ μ‚¬μš©μœΌλ‘œ 반볡 쀄이기
            • Item 15 동적 데이터에 인덱슀 μ‹œκ·Έλ‹ˆμ²˜ μ‚¬μš©ν•˜κΈ°
            • Item 16 number 인덱슀 μ‹œκ·Έλ‹ˆμ²˜λ³΄λ‹€λŠ” Array, νŠœν”Œ, ArrayLikeλ₯Ό μ‚¬μš©ν•˜κΈ°
            • Item 17 λ³€κ²½ κ΄€λ ¨λœ 였λ₯˜ λ°©μ§€λ₯Ό μœ„ν•΄ readonly μ‚¬μš©ν•˜κΈ°
            • Item 18 λ§€ν•‘λœ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ 값을 λ™κΈ°ν™”ν•˜κΈ°
          • Ch.3 νƒ€μž… μΆ”λ‘ 
            • Item 19 μΆ”λ‘  κ°€λŠ₯ν•œ νƒ€μž…μ„ μ‚¬μš©ν•΄ μž₯ν™©ν•œ μ½”λ“œ λ°©μ§€ν•˜κΈ°
            • Item 20 λ‹€λ₯Έ νƒ€μž…μ—λŠ” λ‹€λ₯Έ λ³€μˆ˜ μ‚¬μš©ν•˜κΈ°
            • Item 21 νƒ€μž… λ„“νžˆκΈ°
            • Item 22 νƒ€μž… 쒁히기
            • Item 23 ν•œκΊΌλ²ˆμ— 객체 μƒμ„±ν•˜κΈ°
            • Item 24 일관성 μžˆλŠ” 별칭 μ‚¬μš©ν•˜κΈ°
            • Item 25 비동기 μ½”λ“œμ—λŠ” 콜백 λŒ€μ‹  async ν•¨μˆ˜ μ‚¬μš©ν•˜κΈ°
            • Item 26 νƒ€μž… 좔둠에 λ¬Έλ§₯이 μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ°
            • Item 27 ν•¨μˆ˜ν˜• 기법과 라이브러리둜 νƒ€μž… 흐름 μœ μ§€ν•˜κΈ°
          • Ch.4 νƒ€μž… 섀계
            • Item 28 μœ νš¨ν•œ μƒνƒœλ§Œ ν‘œν˜„ν•˜λŠ” νƒ€μž…μ„ μ§€ν–₯ν•˜κΈ°
            • Item 29 μ‚¬μš©ν•  λ•ŒλŠ” λ„ˆκ·ΈλŸ½κ²Œ, 생성할 λ•ŒλŠ” μ—„κ²©ν•˜κ²Œ
            • Item 30 λ¬Έμ„œμ— νƒ€μž… 정보λ₯Ό μ“°μ§€ μ•ŠκΈ°
            • Item 31 νƒ€μž… 주변에 null κ°’ λ°°μΉ˜ν•˜κΈ°
            • Item 32 μœ λ‹ˆμ˜¨μ˜ μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ μœ λ‹ˆμ˜¨μ„ μ‚¬μš©ν•˜κΈ°
            • Item 33 string νƒ€μž…λ³΄λ‹€ 더 ꡬ체적인 νƒ€μž… μ‚¬μš©ν•˜κΈ°
            • Item 34 λΆ€μ •ν™•ν•œ νƒ€μž…λ³΄λ‹€λŠ” λ―Έμ™„μ„± νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ°
            • Item 35 데이터가 μ•„λ‹Œ, API와 λͺ…μ„Έλ₯Ό 보고 νƒ€μž… λ§Œλ“€κΈ°
            • Item 36 ν•΄λ‹Ή λΆ„μ•Όμ˜ μš©μ–΄λ‘œ νƒ€μž… 이름 μ§“κΈ°
            • Item 37 곡식 λͺ…μΉ­μ—λŠ” μƒν‘œλ₯Ό 뢙이기
          • Ch.5 any 닀루기
            • Item 38 any νƒ€μž…μ€ κ°€λŠ₯ν•œ ν•œ 쒁은 λ²”μœ„μ—μ„œλ§Œ μ‚¬μš©ν•˜κΈ°
            • Item 39 anyλ₯Ό ꡬ체적으둜 λ³€ν˜•ν•΄μ„œ μ‚¬μš©ν•˜κΈ°
            • Item 40 ν•¨μˆ˜ μ•ˆμœΌλ‘œ νƒ€μž… 단언문 감좔기
            • Item 41 any의 μ§„ν™”λ₯Ό μ΄ν•΄ν•˜κΈ°
            • Item 42 λͺ¨λ₯΄λŠ” νƒ€μž…μ˜ κ°’μ—λŠ” any λŒ€μ‹  unknown을 μ‚¬μš©ν•˜κΈ°
            • Item 43 λͺ½ν‚€ νŒ¨μΉ˜λ³΄λ‹€λŠ” μ•ˆμ „ν•œ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ°
            • Item 44 νƒ€μž… 컀버리지λ₯Ό μΆ”μ ν•˜μ—¬ νƒ€μž… μ•ˆμ „μ„± μœ μ§€ν•˜κΈ°
          • Ch.6 νƒ€μž… μ„ μ–Έκ³Ό @types
            • Item 45 devDependencies에 typescript와 @types μΆ”κ°€ν•˜κΈ°
            • Item 46 νƒ€μž… μ„ μ–Έκ³Ό κ΄€λ ¨λœ μ„Έ κ°€μ§€ 버전 μ΄ν•΄ν•˜κΈ°
            • Item 47 곡개 API에 λ“±μž₯ν•˜λŠ” λͺ¨λ“  νƒ€μž…μ„ μ΅μŠ€ν¬νŠΈν•˜κΈ°
            • Item 48 API 주석에 TSDoc μ‚¬μš©ν•˜κΈ°
            • Item 49 μ½œλ°±μ—μ„œ this에 λŒ€ν•œ νƒ€μž… μ œκ³΅ν•˜κΈ°
            • Item 50 μ˜€λ²„λ‘œλ”© νƒ€μž…λ³΄λ‹€λŠ” 쑰건뢀 νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ°
            • Item 51 μ˜μ‘΄μ„± 뢄리λ₯Ό μœ„ν•΄ 미러 νƒ€μž… μ‚¬μš©ν•˜κΈ°
            • Item 52 ν…ŒμŠ€νŒ… νƒ€μž…μ˜ 함정에 μ£Όμ˜ν•˜κΈ°
          • Ch.7 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•˜κΈ°
            • Item 53 νƒ€μž…μŠ€ν¬λ¦½νŠΈ κΈ°λŠ₯λ³΄λ‹€λŠ” ECMAScript κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ°
            • Item 54 객체λ₯Ό μˆœνšŒν•˜λŠ” λ…Έν•˜μš°
            • Item 55 DOM 계측 ꡬ쑰 μ΄ν•΄ν•˜κΈ°
            • Item 56 정보λ₯Ό κ°μΆ”λŠ” λͺ©μ μœΌλ‘œ private μ‚¬μš©ν•˜μ§€ μ•ŠκΈ°
            • Item 57 μ†ŒμŠ€λ§΅μ„ μ‚¬μš©ν•˜μ—¬ νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ””λ²„κΉ…ν•˜κΈ°
          • Ch.8 νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜κΈ°
            • Item 58 λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±ν•˜κΈ°
            • Item 59 νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ„μž… 전에 @ts-check와 JSDoc으둜 μ‹œν—˜ν•΄ 보기
            • Item 60 allowJS둜 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈ 같이 μ‚¬μš©ν•˜κΈ°
            • Item 61 μ˜μ‘΄μ„± 관계에 따라 λͺ¨λ“ˆ λ‹¨μœ„λ‘œ μ „ν™˜ν•˜κΈ°
            • Item 62 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ˜ 완성을 μœ„ν•΄ noImplicitAny μ„€μ •ν•˜κΈ°
        • Dive Into Design Patterns
          • λ””μžμΈ νŒ¨ν„΄ μ†Œκ°œ
          • μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ 원칙듀
          • λ””μžμΈ νŒ¨ν„΄ λͺ©λ‘
          • μœ μš©ν•œ 링크
        • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (System Design Interview)
          • Key Points
          • Real Life Systems
          • Engineering Blogs
        • Node.js λ””μžμΈ νŒ¨ν„΄ 바이블 (Node.js Design Patterns 3rd Edition)
        • λ¦¬νŒ©ν„°λ§ 2판 (Refactoring: 2nd Ed.)
          • 1μž₯ λ¦¬νŒ©ν„°λ§: 첫 번째 μ˜ˆμ‹œ
          • 2μž₯ λ¦¬νŒ©ν„°λ§ 원칙
          • 3μž₯ μ½”λ“œμ—μ„œ λ‚˜λŠ” μ•…μ·¨
          • 4μž₯ ν…ŒμŠ€νŠΈ κ΅¬μΆ•ν•˜κΈ°
Powered by GitBook
On this page
  • About
  • μ˜ˆμ‹œ
  • μ‹€μš© 사둀
  • 정리
  • REF

Was this helpful?

Edit on GitHub
  1. Archives
  2. Learning
  3. Code
  4. Functional Programming

Closure

About

ν΄λ‘œμ €λŠ” μžμ‹ μ΄ 생성될 "λ•Œ"의 μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. (ν΄λ‘œμ €κ°€ κΈ°μ–΅ν•˜λŠ” λ³€μˆ˜μ˜ 값은 λ³€ν•  수 μžˆλ‹€.)

  • μŠ€μ½”ν”„: λ³€μˆ˜λ₯Ό μ–΄λ””μ—μ„œ μ–΄λ–»κ²Œ 찾을지λ₯Ό μ •ν•œ κ·œμΉ™.

    • ν•¨μˆ˜λŠ” λ³€μˆ˜ μ°Έμ‘° λ²”μœ„λ₯Ό κ²°μ •ν•˜λŠ” μ€‘μš”ν•œ 기쀀이닀. ν•¨μˆ˜κ°€ μ€‘μ²©λ˜μ–΄ μžˆλ‹€λ©΄ μŠ€μ½”ν”„λ„ μ€‘μ²©λ˜μ–΄ μƒκ²¨λ‚œλ‹€.

    • κΈ€λ‘œλ²Œ μŠ€μ½”ν”„λ₯Ό μ œμ™Έν•œ μ™ΈλΆ€ μŠ€μ½”ν”„μ— μžˆμ—ˆλ˜ λ³€μˆ˜ 쀑, ν΄λ‘œμ € ν˜Ήμ€ λ‹€λ₯Έ λˆ„κ΅°κ°€κ°€ μ°Έμ‘°ν•˜κ³  μžˆμ§€ μ•Šμ€ λͺ¨λ“  λ³€μˆ˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λλ‚œ ν›„ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ λŒ€μƒμ΄ λœλ‹€. μ–΄λ–€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜κ³ , κ·Έλž˜μ„œ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ ν™˜κ²½μ΄ GC의 λŒ€μƒμ΄ λœλ‹€λ©΄, κ·Έλ ‡κ²Œ 내버렀 λ‘λŠ” ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  보긴 μ–΄λ ΅λ‹€.

function parent() {
  var a = 5
  function myfn() {
    console.log(a)
  }
  // ...
}

function parent2() {
  var a = 5
  function parent1() {
    function myfn() {
      console.log(a)
    }
    // ...
  }
  // ...
}

μ˜ˆμ‹œ

λ‹€μŒ f1은:

  • ν΄λ‘œμ €μ²˜λŸΌ μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ κ²°κ³Όλ₯Ό λ§Œλ“ λ‹€.

  • μƒμœ„ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€.

ν•˜μ§€λ§Œ f1은 ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.

κΈ€λ‘œλ²Œ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έλœ λͺ¨λ“  λ³€μˆ˜λŠ” κ·Έ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ μ—†λŠ”μ§€μ™€ 관계 없이 μœ μ§€λœλ‹€. a, b λ³€μˆ˜κ°€ f1에 μ˜ν•΄ 사라지지 λͺ»ν•˜λŠ” 상황이 μ•„λ‹ˆλ―€λ‘œ f1은 ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.

var a = 10
var b = 20
function f1() {
  return a + b
}
f1() // 30

λ‹€μŒμ€ ν•¨μˆ˜ μ•ˆμ—μ„œ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” 방식이닀. ν•˜μ§€λ§Œ f3, f4 λͺ¨λ‘ ν΄λ‘œμ €κ°€ μ•„λ‹ˆλ‹€.

  • f3은 f2 μ•ˆμ—μ„œ μƒμ„±λ˜μ—ˆλ‹€.

  • f3 λ°”λ‘œ μœ„μ—λŠ” a, bλΌλŠ” μ§€μ—­ λ³€μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ f3 μ•ˆμ—μ„œ μ‹€μ œλ‘œ μ‚¬μš©ν•˜κ³  μžˆλŠ” λ³€μˆ˜λŠ” c, d이고, 두 λ³€μˆ˜ λͺ¨λ‘ f3μ—μ„œ μ •μ˜λ˜μ—ˆλ‹€.

  • μžμ‹ μ΄ 생성될 λ•Œμ˜ μŠ€μ½”ν”„κ°€ μ•Œκ³  μžˆλŠ” λ³€μˆ˜ a, bλŠ” μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ f3이 κΈ°μ–΅ν•΄μ•Ό ν•  λ³€μˆ˜λŠ” ν•˜λ‚˜λ„ μ—†λ‹€.

function f2() {
  var a = 10
  var b = 20
  function f3(c, d) {
    return c + d
  }
  return f3
}

var f4 = f2()
f4(5, 7) // 12

λ‹€μŒ μ˜ˆμ‹œμ—μ„œ ν΄λ‘œμ €κ°€ μžˆμ„κΉŒ? μ •ν™•ν•œ ν‘œν˜„μ€ 'μžˆμ—ˆλ‹€'이닀.

f4κ°€ μ‹€ν–‰λ˜κ³  a, bκ°€ ν• λ‹Ήλœ ν›„ f5κ°€ μ •μ˜λœλ‹€. 그리고 f5μ—μ„œλŠ” a, bκ°€ μ‚¬μš©λ˜κ³  μžˆμœΌλ―€λ‘œ f5λŠ” μžμ‹ μ΄ μƒμ„±λœ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €κ°€ λœλ‹€.

ν•˜μ§€λ§Œ f4의 λ§ˆμ§€λ§‰ λΌμΈμ—μ„œ f5λ₯Ό μ‹€ν–‰ν•΄ λ¦¬ν„΄ν•˜κ³  μžˆλ‹€.

κ²°κ΅­ f5λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” 곳이 어디에도 μ—†μœΌλ―€λ‘œ f5λŠ” 사라지고, f5κ°€ 사라지면 a, b도 μ‚¬λΌμ§ˆ 수 μžˆκΈ°μ— ν΄λ‘œμ €λŠ” f4κ°€ μ‹€ν–‰λ˜λŠ” 사이에 생겼닀가 사라진닀.

function f4() {
  var a = 10
  var b = 20
  function f5() {
    return a + b
  }
  return f5()
}

λ‹€μŒ f7은 μ§„μ§œ ν΄λ‘œμ €μ΄λ‹€.

  • f7이 aλ₯Ό μ‚¬μš©ν•˜κΈ°μ— aλ₯Ό κΈ°μ–΅ν•΄μ•Ό ν•˜λ―€λ‘œ aλŠ” 사라지지 μ•ŠλŠ”λ‹€.

  • f7이 f8에 λ‹΄κ²Όλ‹€.

μ›λž˜λŒ€λ‘œλΌλ©΄ f6의 μ§€μ—­ λ³€μˆ˜λŠ” λͺ¨λ‘ 사라져야 ν•˜μ§€λ§Œ f6 싀행이 끝났어도 f7이 aλ₯Ό κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €κ°€ λ˜μ—ˆκΈ° λ•Œλ¬Έμ— aλŠ” 사라지지 μ•ŠμœΌλ©°, f8을 μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ λ³€μˆ˜μΈ b와 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ κ²°κ³Όλ₯Ό λ§Œλ“ λ‹€.

function f6() {
  var a = 10
  function f7(b) {
    return a + b
  }
  return f7
}

var f8 = f6()
f8(20) // 30
f8(10) // 20

참고둜 a의 λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•ŠλŠ” 것은 κ°œλ°œμžκ°€ μ˜λ„ν•œ κ²ƒμ΄λ―€λ‘œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λΌκ³  λ³Ό 수 μ—†λ‹€.

λ‹€μŒ μ˜ˆμ‹œλŠ” 였λ₯˜κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€.

  • ν΄λ‘œμ €λŠ” μžμ‹ μ΄ 생성될 'λ•Œ'의 μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜λΌκ³  ν–ˆλŠ”λ°, μ—¬κΈ°μ„œ 'λ•Œ'λŠ” 생각보닀 쑰금 κΈΈλ‹€. κ·Έκ±Έ λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œμ΄λ‹€.

    • 'λ•Œκ°€ 쑰금 κΈΈλ‹€'μ—μ„œ λ§ν•˜λŠ” 'λ•Œ'λŠ” ν•¨μˆ˜κ°€ 생성이 λ˜λŠ” λΌμΈμ΄λ‚˜ κ·Έ 이전을 μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹ˆλΌ, κ·Έ μŠ€μ½”ν”„κ°€ μ‹€ν–‰λ˜κ³  μžˆλŠ” μ»¨ν…μŠ€νŠΈ 전체λ₯Ό λ§ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. (이 μ•ˆμ—μ„œ 비동기가 μΌμ–΄λ‚˜λ©΄ λ”μš± 길어지기도 ν•  것이닀.)

  • 'μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜'이라고 ν•˜λŠ” 뢀뢄도 이 μ˜ˆμ œμ—μ„œ μ„€λͺ…λœλ‹€.

    • μ—¬κΈ°μ„œ λ§ν•˜λŠ” κ·Έ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μΌ μˆ˜λ„ μžˆλ‹€. 만일 ν•¨μˆ˜λΌλ©΄ ν•¨μˆ˜κ°€ 싀행될 λ•Œλ§ˆλ‹€ κ·Έ μŠ€μ½”ν”„μ˜ ν™˜κ²½μ€ μƒˆλ‘œ λ§Œλ“€μ–΄μ§„λ‹€.

    • ν΄λ‘œμ € μžμ‹ μ΄ 생성될 'λ•Œμ˜ μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜'의 μ˜λ―ΈλŠ” 'ν΄λ‘œμ €κ°€ μƒμ„±λ˜κ³  μžˆλŠ” 이번 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜'μ΄λΌλŠ” μ˜λ―Έλ‹€.

f10μ—λŠ” 읡λͺ… ν•¨μˆ˜λ₯Ό λ‹΄μ•˜λ‹€. (λ¬Όλ‘  function f10(c) { ... }둜 해도 정상 λ™μž‘ν•œλ‹€.)

f10이 μƒμ„±λ˜κΈ° 이전에 bλŠ” 20으둜 μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜λ‹€. ν΄λ‘œμ €λŠ” μžμ‹ μ΄ μƒμ„±λ˜λŠ” μŠ€μ½”ν”„μ˜ λͺ¨λ“  라인, μ–΄λŠ κ³³μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ“ μ§€ μ°Έμ‘°ν•˜κ³  κΈ°μ–΅ν•  수 μžˆλ‹€. 그리고 그것은 λ³€μˆ˜μ΄κΈ°μ— ν΄λ‘œμ € 생성 이후 μ–Έμ œλ“  값이 변경될 수 μžˆλ‹€.

function f9() {
  var a = 10
  var f10 = function(c) {
    return a + b + c
  }
  var b = 20
  return f10
}

var f11 = f9()
f11(30) // 60

λ‹€μ‹œ ν΄λ‘œμ €λ₯Ό ν’€μ–΄μ„œ μ •μ˜ν•΄ 보자.

ν΄λ‘œμ €λŠ” μžμ‹ μ΄ μƒμ„±λ˜λŠ” μŠ€μ½”ν”„μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ λ§Œλ“€μ–΄μ‘Œκ±°λ‚˜ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜ 쀑 μ–Έμ  κ°€ μžμ‹ μ΄ 싀행될 λ•Œ μ‚¬μš©ν•  λ³€μˆ˜λ“€λ§Œ κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. ν΄λ‘œμ €κ°€ κΈ°μ–΅ν•˜λŠ” λ³€μˆ˜μ˜ 값은 μ–Έμ œλ“ μ§€ λ‚¨μ΄λ‚˜ μžμ‹ μ— μ˜ν•΄ 변경될 수 μžˆλ‹€.

μ‹€μš© 사둀

ν΄λ‘œμ €μ˜ κ°•λ ₯ν•¨μ΄λ‚˜ μ‹€μš©μ„±μ€ 은닉에 μžˆμ§€ μ•Šλ‹€. 은닉은 의미 μžˆλŠ” 기술이자 κ°œλ…μ΄μ§€λ§Œ, 은닉 μžμ²΄κ°€ ν΄λ‘œμ €μ˜ λͺ©μ μ€ μ•„λ‹ˆλ‹€.

ν΄λ‘œμ €κ°€ κ°•λ ₯ν•˜κ³  μ‹€μš©μ μΈ 상황은 λ”°λ‘œ μžˆλ‹€.

  • 이전 상황을 λ‚˜μ€‘μ— 일어날 상황과 이어 λ‚˜κ°ˆ λ•Œ

  • ν•¨μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“€κ±°λ‚˜ λΆ€λΆ„ μ μš©μ„ ν•  λ•Œ

이전 상황을 λ‚˜μ€‘μ— 일어날 상황과 이어 λ‚˜κ°ˆ λ•Œ

  • 이벀트 λ¦¬μŠ€λ„ˆλ‘œ ν•¨μˆ˜λ₯Ό λ„˜κΈ°κΈ° 이전에 μ•Œ 수 μžˆμ—ˆλ˜ 상황듀을 λ³€μˆ˜μ— λ‹΄μ•„ ν΄λ‘œμ €λ‘œ λ§Œλ“€μ–΄ κΈ°μ–΅ν•΄ 두면, μ΄λ²€νŠΈκ°€ λ°œμƒλ˜μ–΄ ν΄λ‘œμ €κ°€ μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ κΈ°μ–΅ν•΄ λ‘μ—ˆλ˜ λ³€μˆ˜λ“€λ‘œ 이전 상황듀을 μ΄μ–΄κ°ˆ 수 μžˆλ‹€.

  • 콜백 νŒ¨ν„΄μ—μ„œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ 콜백으둜 ν•¨μˆ˜λ₯Ό λ„˜κΈ°κΈ° 이전 상황을 ν΄λ‘œμ €λ‘œ λ§Œλ“€μ–΄ κΈ°μ–΅ν•΄ λ‘λŠ” μ‹μœΌλ‘œ μ΄μ „μ˜ 상황을 이어 갈 수 μžˆλ‹€.

정리

ν΄λ‘œμ €λŠ”...

  • μžμ‹ μ΄ 생성될 "λ•Œ"의 μŠ€μ½”ν”„μ—μ„œ μ•Œ 수 μžˆμ—ˆλ˜ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

  • 사싀 μ‚¬μš©ν•˜κΈ° λ³„λ‘œ μ–΄λ ΅μ§€ μ•Šλ‹€.

  • μ ˆμ°¨μ§€ν–₯, 객체지ν–₯, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° λͺ¨λ‘λ₯Ό μ§€νƒ±ν•˜λŠ” 맀우 μ€‘μš”ν•œ κΈ°λŠ₯이자 κ°œλ…μ΄λ‹€.

  • μ„œλ‘œ λΆ„λ¦¬λœ μ»¨ν…μŠ€νŠΈλ‚˜ 객체λ₯Ό μ‰¬μš΄ κ°œλ…μœΌλ‘œ 이어쀀닀.

  • 많이 μ‚¬μš©ν•˜μž. λ¬Έμ œκ°€ μΌμ–΄λ‚˜λ©΄ κ·Έ λ•Œ ν•΄κ²°ν•˜μž. (μ›¬λ§Œν•΄μ„œλŠ” 문제λ₯Ό μΌμœΌν‚€μ§€ μ•Šμ„ 것이닀.)

REF

PreviousHigher-Order FunctionNextMonad

Last updated 2 years ago

Was this helpful?

ν•¨μˆ˜ν˜• μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œκ·Έλž˜λ° - μœ μΈλ™ μ €