클로져(Closure)

이지혜·2023년 5월 23일

동적스코프(dynamic scope)

어디서 호출했느냐에 따라서 접근할 수 있는 유효범위가 달라지는 스코프. (호출된 곳 기준을 상위 스코프 결정)

정적스코프(static scope)

변수가 선언된 블록(함수, 클래스, 모듈 등) 내에서만 유효한 스코프. (정의된 곳 기준을 상위 스코프 결정)

자바스크립트는 정적스코프(static scope) 이자 어휘적스코프(lexical scope)


어떤 함수가 있을 때, 그 함수의 유효 범위는 그 함수를 어디서 실행했느냐가 아니라, 어디서 정의 됬느냐에 따라서 달라진다. 자바스크립트는 어휘적 환경(Lexical Environment)을 갖는다.

함수의 호출 -> 동적 스코핑(여러군데서 불러서 사용가능)
함수의 정의 -> 정적 스코핑(한군데에 한번만 정의)



❖ Closure 정의

-함수와 lexical 환경의 조합.
-함수가 생성(정의)될 당시의 외부변수를 기억하고, 생성 이후에도 계속 접근 가능.
-내부 함수의 실행이 끝나서 그 함수가 소멸된 이후에도, 내부 함수가 외부함수에 접근할 수 있음.

클로저는 함수가 다른 함수 내부에서 정의되었을 때, 내부 함수가 자신이 선언된 위치에 대한 정보와 함께 외부 함수의 변수에 접근할 수 있는 능력을 가지는 것을 의미합니다. 이로 인해 클로저는 외부 함수의 변수에 계속 접근하고 조작할 수 있게 됩니다. 클로저는 자주 이벤트 핸들러, 타이머, 비동기 작업 등 다양한 상황에서 활용되며, 유용한 기능을 제공하는 개념입니다.




👉🏻 Javascript에서 Closure 사용

  1. 비동기 작업 관리: 비동기적인 작업에서 클로저를 사용하여 상태를 유지하고 데이터를 보존할 수 있습니다. 예를 들어, 타이머나 AJAX 요청 등의 비동기 작업에서 클로저를 활용하여 작업이 완료될 때까지 상태를 추적하거나 결과를 처리할 수 있습니다.

  2. 정보 은닉과 캡슐화: 클로저를 사용하여 변수를 비공개(private)로 선언하고, 함수 외부에서의 접근을 제한할 수 있습니다. 이를 통해 변수와 함수를 캡슐화하여 외부로부터의 접근과 조작을 제어할 수 있습니다.

  3. 데이터 보존과 상태 관리: 클로저는 함수가 종료된 후에도 외부 함수의 변수에 접근할 수 있기 때문에, 데이터를 계속해서 보존하고 상태를 관리할 수 있습니다. 이를 활용하여 여러 함수 간에 데이터를 공유하고 유지할 수 있습니다.

  4. 반복문과 콜백 함수: 클로저를 사용하여 반복문 내에서 비동기 작업이나 콜백 함수를 처리할 때, 각각의 클로저가 고유한 상태를 가지고 작업을 수행할 수 있습니다. 이는 반복문의 변수가 콜백 함수에서 예상치 못한 값으로 변경되는 문제를 해결하고, 각각의 콜백 함수가 독립적으로 동작할 수 있도록 합니다.

  5. 메모리 관리: 클로저는 외부 함수의 변수에 대한 참조를 유지하기 때문에, 해당 변수를 계속해서 사용해야 하는 상황에서 메모리 누수를 방지할 수 있습니다. 클로저를 사용하여 필요한 변수에 대한 접근을 관리하고 메모리를 효율적으로 관리할 수 있습니다.


예제코드)


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 은 다른 환경을 가지고 있음을 의미.




참고자료)

https://www.youtube.com/watch?v=tpl2oXQkGZs

profile
고민하고 실행하는 프론트엔드 개발자, 이지혜입니다.

0개의 댓글