여러가지 정의들 중에, 개인적으로 좀 더 직관적으로 받아들여 졌던 정의는, 다음과 같다
클로저란, 생성한 시점의 스코프체인을 기억하여, 비공개 변수를 가질수 있는 환경에 있는 함수이다.
이 외, 다른 정의들
- MDN) 클로저는 독립적인 변수를 가리키는 함수이다. 또는 클로저 안에 정의된 함수는 만들어진 환경을 기억한다.
- 함수와 렉시컬 환경의 조합
- 함수가 생성될 당시의 외부변수를 기억하여 생성 이후에도 계속 참조가 가능한 것
- 생성한 시점의 스코프체인을 계속 들고있는 함수
일단 실무에서는 private 변수를 사용하기 위한 것으로 많이 쓰인다.
선행지식 스코프체인
스코프는 일단 범위라는 뜻인데, 간단하게 브라켓{}, 블록 안 저장소라고 생각하자.
블록별로 (if문, 함수선언문, while...등) 자기만의 스코프를 갖는것이다.
근데 이게 전역 안에 외부함수 안에 내부함수 안에 내부함수 .... 이런식으로 함수안의 함수를 알낳기를 계속하면,
내부의 브라켓(함수)부터 상위의 스코프를 참조할 수 있다.
체인처럼 이어서 참조할 수 있다는 것을 스코프 체인이라 한다.
다시 클로저로 돌아와서,
클로저는 이 스코프 체인의 특성을 이용하면서 블록안의 변수를 블록 밖에서도 사용할 수 있게한다.
하지만 매우 제한적인 조건으로
여기서 제한적인 조건이 나오는데, 내부의 변수나 메소드들을 지정하고 외부에서 끌어쓸때 함부로 내부의 내용들을 변경할 수 없게 만든다.
그런맥락에서 이름이 클로저가 아닐까 싶다.
function makeCounter() {
let num = 0;
return function() {
return num++
}
}
let counting = makeCounter();
console.log(counting()) // 0
console.log(counting()) // 1
console.log(counting()) // 2
console.log(counting.num) // undefined
'programming > Javascript' 카테고리의 다른 글
[Javascript] 제너레이터 (Generator) 이터러블, 이터레이터와 비교 (0) | 2022.03.05 |
---|---|
[Javascript] (iterable 프로토콜, iterator 프로토콜) of [iteration 프로토콜] (0) | 2022.03.05 |
[Javascript] Callback 과 Promise 와 async-await (0) | 2022.03.04 |
[Javascript] 엔진 구조와 동작 방식 (0) | 2022.02.18 |
[Javascript] var, let, const 차이 - 중복선언, 호이스팅, 스코프 관점 (0) | 2022.02.17 |