함수와 그 함수가 선언됐을 때의 렉시컬환경(Lexical Environment)과의 조합
위의 클로저는 함수가 선언되었을 때 렉시컬환경과의 조합이라는 말은 와닫지 않는다. 보다 풀어서 설명하자면 "내부함수가 외부함수 변수에 접근할 수 있는 Javascript 기능이다."라고 설명할 수 있다. 이러한 클로저의 특징을 통해 코드의 재사용성과 유연성을 높일 수 있다. 아래의 코드로 자세히 이해해보자.
// inner 함수가 outer 함수 바깥에서 정의된 경우
const x = 1;
function outer() {
const x = 10;
inner();
}
function inner() {
console.log(x);
}
outer(); // 1
// inner 함수가 outer 함수 내부에서 정의된 경우
const x = 1;
function outer() {
const x = 10;
function inner() {
console.log(x);
}
inner();
}
outer(); // 10
위 두 코드에서 inner()함수가 정의된 위치에 따라서 참조가 변하는 것을 확인할 수 있다.
첫 번째 outer()외부에서 inner()가 선언된 경우 inner()의 상위스코프인 전역 스코프의 x를 참조하여 1이 출력된다.
두 번째 outer()내부에서 inner()가 선언된 경우 inner()의 상위스코프는 outer()이다. outer()에서 정의된 x가 10이므로 10을 출력한다.
Javascript는 정적 스코프를 따르는 언어이므로 함수가 선언된 위치에 따라 상위스코프가 정해진다. 클로저는 이 함수와 이 함수의 상위 스코프와의 조합이다.
클로저의 특징
- 클로저는 스코프를 기억한다.
- 클로저는 자신이 생성될 때의 환경인 렉시컬 환경(Lexical Environment)를 기억한다.
- 이를 통해 함수 외부 스코프(상위 스코프)의 변수 등을 참조할 수 있다.
- 객체지향 프로그래밍과 유사하다
- 클로저는 데이터와 그 데이터를 조작하는 함수를 연관시켜준다.
- 객체가 어떤 데이터와 하나 이상의 그 메서드들을 연관시킨다는 점에서 비슷한 맥락이 있다.
- 은닉화와 캡슐화를 지원한다.
- 클로저를 사용하여 데이터와 함수를 캡슐화할 수 있다.
- 함수 내부에 선언된 변수에 직접적으로 접근할 수 없다.
- 이미 컨텍스트가 종료된 이후에도 메모리를 참조할 수 있다.
- 클로저는 자신이 생성될 때의 환경을 기억하기 때문에 참조가 가능하다.
클로저는 보통 캡슐화와 은닉화를 구현하는 방법 중 하나로 이해한다면 쉽게 접근할 수 있다.
'TIL' 카테고리의 다른 글
[JS] 클래스(Class) (0) | 2023.07.22 |
---|---|
[JS] 프로토타입(prototype) (0) | 2023.07.20 |
[JS] 변수와 함수 호이스팅(Hoisting) (0) | 2023.07.17 |
[JS] 실행컨텍스트 (0) | 2023.07.14 |
[JS] 화살표함수(Arrow Function)와 this (0) | 2023.07.10 |