일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- if else
- 함수선언식
- typeof
- for in
- 함수표현식
- for of
- 프론트엔드
- 문자열
- 조건문
- 화살표함수
- javascript
- 타입
- justify-content
- 비교연산자
- flex
- flex-wrap
- 함수
- frontend
- 변수
- for
- boolean
- 반복문
- ELSE
- 속성
- Methods
- 기초
- 논리연산자
- properties
- align-content
- flex-direction
- Today
- Total
하얀 코딩
[JavaScript - 10] 클로저(Closure) 본문
정의
함수와 함수가 선언된 어휘적(lexical) 환경의 조합을 말한다.
이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성된다.
위 정의에서 말하는 “함수”란 반환된 내부함수를 의미하고 “그 함수가 선언될 때의 렉시컬 환경(Lexical environment)”란 내부 함수가 선언됐을 때의 스코프를 의미한다. 즉, 클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수를 말합니다.
이를 조금 더 간단히 말하면 클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수다라고 말할 수 있습니다.
특징
1. 일반적인 함수는, 함수 실행이 끝나고 나면 함수 내부의 변수를 사용할 수 없습니다.
이와 다르게, 클로저는 외부 함수의 실행이 끝나더라도, 외부 함수 내 변수가 메모리 상에 저장됩니다.
(어휘적 환경을 메모리에 저장하기 때문에 가능한 일입니다)
2. 클로저를 통해 불필요한 전역 변수 사용을 줄이고, 스코프를 이용해 값을 보다 안전하게 다룰 수 있습니다.
3. 함수 하나를 완전히 독립적인 부품 형태로 분리하는 것을 모듈화라고 합니다.
클로저를 통해 데이터와 메서드를 같이 묶어서 다룰 수 있습니다. 즉, 클로저는 모듈화에 유리합니다. (정보의 은닉)
4. 클로저가 가장 유용하게 사용되는 상황은 현재 상태를 기억하고 변경된 최신 상태를 유지하는 것입니다.
const makeCounter = () => {
let value = 0;
return {
increase: () => value = value + 1,
decrease: () => value = value - 1,
getValue: () => value
}
}
const counter1 = makeCounter();
counter1.increase();
counter1.increase();
counter1.decrease();
counter1.decrease();
counter1.increase();
counter1.getValue(); // ?
변수의 값은 누군가에 의해 언제든지 변경될 수 있어 오류 발생의 근본적 원인이 될 수 있다.
상태 변경이나 가변(mutable) 데이터를 피하고 불변성(Immutability)을 지향는 함수형 프로그래밍에서
부수 효과(Side effect)를 최대한 억제 하여 오류를 피하고 프로그램의 안정성을 높이기 위해 클로저는 적극적으로 사용된다
'JavaScript' 카테고리의 다른 글
[JavaScript - 12] 전개 문법 (Spread syntax) (0) | 2022.11.13 |
---|---|
[JavaScript - 11] 호이스팅(hoisting) (0) | 2022.11.11 |
[JavaScript - 9] 스코프(Scope) (0) | 2022.11.08 |
[JavaScript - 8] 원시 / 참조 자료형 (0) | 2022.11.08 |
[JavaScript - 7] 객체 (0) | 2022.11.08 |