3 min to read
클로저
클로저란?
상위 함수의 실행이 완료된 후에도 함수가 상위 범위의 변수에 대한 엑세스를 유지할 수 있도록 하는 개념. 본질적으로 참조 변수를 닫아 해당 값을 보존함.
내부 함수가 외부 함수 내에 정의되고 외부 함수 범위의 변수를 참조할 때 생성됨. 클로저라고 알려진 내부 함수는 상위 범위 함수의 모든 변수를 포함하여 주변 환경과 클로저를 형성함.
클로저의 일반적인 사용 예는 프라이빗 변수를 만들고 함수 내에서 데이터를 캡슐화하는것. 외부 함수에서 변수를 정의하고 클로저를 통해 변수에 엑세스함으로서 가시성을 제어하고 함수 외부에서 직접 수정하는 것을 방지할 수 있음.
클로저는 콜백과 비동기 JS에서 중요한 역할을 하는데 비동기 작업 내 변수의 컨텍스트와 상태를 유지할 수 있으므로 콜백이 호출될 때 올바른 값에 엑세스할 수 있음.
클로저는 상위 범위의 변수에 대한 참조를 유지하므로 메모리에 영향을 미친다는 점에서 유의, 따라서 클로저 작업시 장기 실행 앱에서는 메모리 관리가 필요함.
JS의 클로저를 이해하면 상태를 보존하고 함수 내 데이터를 캡슐화 하여 보다 유연하며 모듈식 및 유지 관리가 가능한 코드를 만들 수 있음.
클로저의 예시
- 중첩함수 클로저 ```js function parentFunction(x) {var childFunction = function(){ console.log(x); } return childFunction; };
var myFunction = parentFunction(5);myFunction();
> 내부함수 'childFunction'은 인수 'x'와 'parentfunction' 내 정의된 변수 'y'를 포함한 외부함수 'parentFunction' 범위 내의 변수에 엑세스 할 수 있음.
* 콜백함수 클로저
```js
function myFunction(x, callback){
let y = 10;
return callback(x, y);
}
let result = myFunction(5, function(x,y)){
return x * y;
});
console.log(result);
‘myFunction’에 인수로 전달된 콜백함수는 변수 ‘x’ ‘myFunction’ 내 정의된 변수 ‘y’를 포함해 ‘myFunction’범위 내의 변수에 엑세스할 수 있음. 이 콜백함수는 ‘myFunction’ 범위 내 변수를 ‘닫아’ 클로저를 형성하므로 ‘myFunction’이 반환된 후에도 해당 변수에 엑세스하고 유지할 수 있음.
- 객체 메서드 클로저
let myObject = { x: 5, y: 10, myMethod: function(){ return this.x + this.y; } }; console.log(myObject.myMethod());
‘myMethod’ 메서드는 ‘x’및 ‘y’를 포함한 객체 속성에 엑세스할수 있고, 객체 속성을 닫아 클로저를 형성해 이런 속성에 엑세스하고 유지할 수 있음.
클로저는 프라이빗 변수에 엑세스 가능한 내부 함수를 반환해 JS에서 프라이빗 변수와 메서드를 만드는데 자주 사용됨. 이런 방식으론 내부 함수는 개인 변수를 조작할 수 있지만 클로저 외부에서 직접 접근할 순 없음.
클로저는 일반적으로 데이터와 동작을 함께 유지하는데 사용함.
클로저 작업시 규칙
-
클로저는 자신이 포함하는 함수 범위 내 변수에 접근할 수 있음, 클로저는 함수가 실행을 완료한 후 정의된 함수 범위내에서 변수에 접근하고 조작할 수있음.
-
클로저는 자신만의 범위를 가짐. 클로저는 포함하는 함수의 범위나 전역 범위 또는 별개로 자체 범위를 가짐. 클로저 내 정의된 변수는 클로저 외부접근이 불가능.
-
클로저는 포함하는 함수 범위의 변수를 참조할 수 있음. 클로저는 매개 변수 및 지역 변수를 포함해 포함하는 함수 범위의 변수를 참조할 수 있음. 클로저는 이런 변수에 대한 참조를 유지함으로 포함된 함수의 실행이 완료된 후에도 해당 변수에 엑세스 가능.
-
클로저는 상위 범위의 변수에 엑세스 할 수 있음. 포함된 함수 범위의 변수에 엑세스하는 것 외에도 클로저는 상위 범위의 변수에 엑세스 할 수도 있음. 이는 클로저가 여러 수준 중첩함수에서 변수에 엑세스 가능함을 의미.
-
클로저는 포함하는 함수의 상태를 보존하고 생성당시 포함하는 함수 범위에서 변수의 상태를 캡처하고 유지함. 이를 통해 포함하는 함수가 이미 반환된 경우에도 클로저가 해당 변수의 값을 기억할 수 있음.
-
메모리 누수를 방지하려면 클로저를 주의할 것. 클로저는 더 이상 필요하지 않은 변수나 객체에 대한 참조를 보유하는 경우 잠재적으로 메모리 누수로 이어질 수 있으니 불필요한 참조 해제 및 가비지 수집 등으로 과도한 메모리 사용을 방지할 것.
-
클로저는 일반적으로 콜백 및 이벤트 리스너에서 사용. 클로저는 콜백 또는 이벤트 리스너가 주변 컨텍스트 또는 변수에 대한 엑세스를 유지해야하는 시나리오에서 자주 사용됨.
-
클로저는 프라이빗 변수와 메서드를 활성화함. 함수 내에서 비공개 변수와 메서드를 생성하는 방법을 제공함. 클로저 내 변수를 포함하면 함수 외부에서 변수에 엑세스할 수 없게되여 데이터캡슐화 및 정보 숨김이 향상됨.