programming/Javascript
[Javascript] 클로저란? private 변수, 메소드의 관점
euuuuuz:
2022. 2. 17. 08:59
여러가지 정의들 중에, 개인적으로 좀 더 직관적으로 받아들여 졌던 정의는, 다음과 같다
클로저란, 생성한 시점의 스코프체인을 기억하여, 비공개 변수를 가질수 있는 환경에 있는 함수이다.
이 외, 다른 정의들
- 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