클로져는 프로토타입, 비동기와 같이 자바스크립트의 특징 중 하나이다.
클로져는 함수가 선언될때 그 주변환경과 관련 생성되는 개념이다.
외부함수의 변수에 접근 할 수 있는 내부함수. 함수가 실행되는 위치나 시점과는 관계없이 함수가 선언될 당시의 주변 환경을 기억하는 것.
function say () {
const a = 1;
const b = 2;
function log () {
console.log(a + b); // 3
}
return log;
}
const func = say();
func();
실행되는 func(); 위치를 기준으로 보면 a,b에 접근 안되지만 a, b 변수가 담겨있는 say 함수 스코프의 외부임에도 불구하고 a의 값과 b의 값을 콘솔에 출력하는데 아무런 문제가 없다.
say 함수가 실행됨으로써 변수 a, b가 선언되었고, log 함수 또한 생성되었다. 이때 log 함수는 선언될 당시 주변 환경을 기억하게 된다. 그렇기에 실제로 실행되는 부분이 외부 스코프 혹은 나중 시점이라 하더라도 함수가 선언될 당시 기존 환경에 대한 접근이 가능한 것이다.
클로저가 형성되어 기억하게 되는 환경 정보는 함수가 선언될 당시에만 순간적으로 포착하고 기억되는 것이 아니라 지속적으로 그 변화를 추적하게 된다.
function addCurry (x) {
return function add (y) {
return x + y;
};
}
const addFive = addCurry(5);
const result = addFive(5);
console.log(result);
//return function add(){} 는 add 함수를 만들어서 리턴하는 것이다.
실행 컨텍스트
글로벌 컨텍스트가 가장 먼저 생기고 그 다음 실행 컨텍스트가 생김. 함수가 실행될 떄 생김.
for (var i = 1; i < 6; i++) {
setTimeout(function timer () {
console.log(i);
}, i * 1000);
}
//var i를 게속 주시하고 있다. i가 6이 되고 실행됨. 5번
1대 5.
function setTimer (j) {
function timer () {
console.log(j);
}
setTimeout(timer, j * 1000);
}
for (var i = 1; i < 6; i++) {
setTimer(i);
}
// 1대 1로 맵핑 .