기술질문
클로저가 뭔가요?
클로저는 함수와 그 함수가 정의된 렉시컬 환경이 결합된 상태를 말합니다.
이 상태로 인해 함수는 자신이 정의될 당시의 변수를 기억하고, 그 변수에 접근할 수 있는 것입니다.
MDN 공식 문서
클로저는 함수와 그 함수가 선언된 주변 상태(렉시컬 환경, 그 환경에 있는 변수들)를 함께 묶은 조합임.
쉽게 말해 클로저는 내부함수가 외부함수의 스코프에 접근할 수 있게 해주는 메커니즘임.
자바스크립트에서는 함수가 생성될 때마다 클로저가 만들어진다고 보면됨.
렉시컬 스코핑은 자바스크립트가 변수를 찾는 방식임.
함수가 정의된 위치에 따라 변수의 스코프가 결정되고, 함수가 실행될 때, 해당 함수가 어디에서 정의되었는지에 기반에 외부 변수에 접근 가능함.
이런 접근 가능성은 함수가 호출되는 시점이 아니라 정의되는 시점에 결정됨
- 내부 함수 : 외부 함수의 스코프 안에서 정의된 함수
- 외부 함수의 변수: 내부 함수가 접근할 수 있는 외부 함수의 변수들
- 환경 : 내부 함수가 정의될 때의 외부 함수의 스코프
- 내부 함수가 외부 함수의 변수를 참조할 수 있어야함
- 외부함수의 실행이 끝난 후에도 변수 접근이 유지됨
외부함수의 실행이 끝난 후에도 변수 접근이 유지됨:
일반적인 함수는 실행이 끝나면 메모리에서 해당 함수의 스코프 및 변수는 사라짐.
하지만 외부함수의 변수를 내부함수가 참조한 형태에서는 외부함수의 호출이 끝난 후에도, 내부함수(클로저)가 외부함수의 스코프를 계속 참조하고 있으므로, 메모리에서 사라지지 않음
⇒ inner
함수가 outer
함수 변수 참조하고 있어서, outer
함수 실행이 끝난 뒤에도 outer
함수의 변수들을 기억하고 있다는 뜻
function outer() {
let outerVar = "I am outside!";
function inner() {
console.log(outerVar); // innerFunction이 외부 함수의 변수에 접근
}
return inner; // 클로저를 반환
}
const myClosure = outer(); // outer 실행 후 innerFunction 반환
myClosure();
outerFunction
의 실행이 끝난 후에도 innerFunction
이 outerVar
을 계속 참조할 수 있기 때문에 클로저가 형성돼.
function makeAdder(x) {
return function (y) {
return x + y;
};
}
const add5 = makeAdder(5);
const add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
makeAdder
는 x라는 매개변수를 받아서 x와 y를 더하는 함수를 반환함 → 이 반환된 함수는 x+y를 반환함
makeAdder(5)
를 호출하면, 내부에서는 x가 5로 설정된 함수를 반환함.
이 함수는 x=5가 포함된 렉시컬 환경을 기억하고 있고, 이 반환된 함수가add5
에 할당됨
makeAdder(10)
을 호출하면, 내부에서 x가 10으로 설정된 함수를 반환함.
이 함수는 x=10이 포함된 렉시컬 환경을 기억하고 있고, 이 반환된 함수가 add10에 할당됨
add5와 add10은 동일한 함수 본문을 사용하고 있지만, 각기 다른 렉시컬 환경을 가지고 있음
클로저 덕분에 add5와 add10은 자신이 정의될 때의 x값을 계속해서 사용 가능한거임
클로저는 함수의 생성 시점에서의 상태를 “기억”하고, 나중에 호출되었을 때 그 상태를 유지하며 사용할 수 있게 해준다
.
.
.
끝🫠