
클로저란 내부함수와 외부함수의 상태가 함께 묶여있다, 갇혀있다 라는 의미이며
즉 내부함수가 외부함수의 렉시컬 환경(블록 정보)에 접근 할 수 있는 것을 말한다.
클로저는 스코프의 특징과 연관되어있다.
스코프의 특징은 어떤 블록이든 내부 블록에서 외부 블록에 있는 변수를 참조할 수 있었다.
왜냐하면 내부 블록이 가지고 있는 렉시컬 환경은 부모를 참조하고 있기 때문이다.
코드 📄
function outer(){
const x=10;
function inner(){
console.log(`내부 함수의 외부함수 값 참조: ${x}`);
}
inner();
}
outer();
//내부 함수의 외부함수 값 참조: 10
코드 📄
function outer(){
const x=10;
function inner(){
console.log(`내부 함수의 외부함수 값 참조: ${x}`);
}
return inner;
}
const func1= outer();
func1(); // 내부 함수의 외부함수 값 참조: 10
데이터를 은닉하고 캡슐화하기 위해 클로저를 사용할 수 있다.
생성자 함수에서의 클로저 활용
코드 📄
function Counter(){
let count =0;
this.increase = () =>{
count++;
return count;
}
this.decrease = () => {
count--;
return count;
}
}
const counter =new Counter();
console.log(counter.increase()); // 1
console.log(counter.increase()); // 2
console.log(counter.increase()); // 3
console.log(counter.decrease()); // 2
console.log(counter.decrease()); // 1
console.log(counter.count); // undefined
현대에 와서는 정보은닉을 위해 클로저를 사용하기 보다는 클래스의 private(#)을 사용한다.
class Counter{
#count =0;
increase(){
this.#count++;
console.log(this.#count);
}
decrease(){
this.#count--;
console.log(this.#count);
}
}
const counter =new Counter();
counter.increase(); // 1
counter.increase(); // 2
counter.decrease() // 1