어디서 호출했느냐에 따라서 접근할 수 있는 유효범위가 달라지는 스코프. (호출된 곳 기준을 상위 스코프 결정)
변수가 선언된 블록(함수, 클래스, 모듈 등) 내에서만 유효한 스코프. (정의된 곳 기준을 상위 스코프 결정)
자바스크립트는 정적스코프(static scope) 이자 어휘적스코프(lexical scope)
어떤 함수가 있을 때, 그 함수의 유효 범위는 그 함수를 어디서 실행했느냐가 아니라, 어디서 정의 됬느냐에 따라서 달라진다. 자바스크립트는 어휘적 환경(Lexical Environment)을 갖는다.
함수의 호출 -> 동적 스코핑(여러군데서 불러서 사용가능)
함수의 정의 -> 정적 스코핑(한군데에 한번만 정의)
-함수와 lexical 환경의 조합.
-함수가 생성(정의)될 당시의 외부변수를 기억하고, 생성 이후에도 계속 접근 가능.
-내부 함수의 실행이 끝나서 그 함수가 소멸된 이후에도, 내부 함수가 외부함수에 접근할 수 있음.
클로저는 함수가 다른 함수 내부에서 정의되었을 때, 내부 함수가 자신이 선언된 위치에 대한 정보와 함께 외부 함수의 변수에 접근할 수 있는 능력을 가지는 것을 의미합니다. 이로 인해 클로저는 외부 함수의 변수에 계속 접근하고 조작할 수 있게 됩니다. 클로저는 자주 이벤트 핸들러, 타이머, 비동기 작업 등 다양한 상황에서 활용되며, 유용한 기능을 제공하는 개념입니다.

비동기 작업 관리: 비동기적인 작업에서 클로저를 사용하여 상태를 유지하고 데이터를 보존할 수 있습니다. 예를 들어, 타이머나 AJAX 요청 등의 비동기 작업에서 클로저를 활용하여 작업이 완료될 때까지 상태를 추적하거나 결과를 처리할 수 있습니다.
정보 은닉과 캡슐화: 클로저를 사용하여 변수를 비공개(private)로 선언하고, 함수 외부에서의 접근을 제한할 수 있습니다. 이를 통해 변수와 함수를 캡슐화하여 외부로부터의 접근과 조작을 제어할 수 있습니다.
데이터 보존과 상태 관리: 클로저는 함수가 종료된 후에도 외부 함수의 변수에 접근할 수 있기 때문에, 데이터를 계속해서 보존하고 상태를 관리할 수 있습니다. 이를 활용하여 여러 함수 간에 데이터를 공유하고 유지할 수 있습니다.
반복문과 콜백 함수: 클로저를 사용하여 반복문 내에서 비동기 작업이나 콜백 함수를 처리할 때, 각각의 클로저가 고유한 상태를 가지고 작업을 수행할 수 있습니다. 이는 반복문의 변수가 콜백 함수에서 예상치 못한 값으로 변경되는 문제를 해결하고, 각각의 콜백 함수가 독립적으로 동작할 수 있도록 합니다.
메모리 관리: 클로저는 외부 함수의 변수에 대한 참조를 유지하기 때문에, 해당 변수를 계속해서 사용해야 하는 상황에서 메모리 누수를 방지할 수 있습니다. 클로저를 사용하여 필요한 변수에 대한 접근을 관리하고 메모리를 효율적으로 관리할 수 있습니다.
예제코드)
function makeAdder(x){
return function(y){ // y 를 가지고 있고
return x + y; // 상위함수인 makeAdder 의 x 에 접근가능
}
}
const add3 = makeAdder(3);
console.log(add3(2)); // 5 // add3 함수가 생성된 이후에도
// 상위함수인 makeAddr 의 x 에 접근가능
const add10 = makeAdder(10); // makeAdder(10)이 호출되지만
console.log(add10(5)); // 15
console.log(add3(1)); // 4 // add(3)에는 아무런 변화가 없음
=> add10 과 add3 은 다른 환경을 가지고 있음을 의미.
참고자료)