JS 21.03.12
in Dev on Java Script
closure : 외부 함수의 변수에 접근 할 수 있는 내부 함수(또는 이러한 작동 원리를 일컫는 용어)
클로저는 외부함수의 컨텍스트(변수, 인자, 파라미터 등)에 접근할 수 있는 내부함수를 뜻합니다. 외부함수의 실행이 종료된 후에도, 클로저 함수는 외부함수의 스코프, 즉, 함수가 선언된 어휘적 환경에 접근할 수 있습니다.
클로저 사용 예시: 클로저를 통해 커링(currying, 함수 하나가 n개의 인자를 받는 대신 n개의 함수를 만들어 각각 인자를 받게 하는 방법), 클로저 모듈(변수를 외부 함수 스코프 안쪽에 감추어, 변수가 함수 밖에서 노출되는 것을 막는 방법) 등의 패턴을 구현할 수 있습니다.
클로저의 단점: 일반 함수였다면 함수 실행 종료 후 가비지 컬렉션(참고 자료: MDN ‘자바스크립트의 메모리 관리’) 대상이 되었을 객체가, 클로저 패턴에서는 메모리 상에 남아 있게 됩니다. 외부 함수 스코프가 내부함수에 의해 언제든지 참조될 수 있기 때문입니다. 따라서 클로저를 남발할 경우 퍼포먼스 저하가 발생할 수도 있습니다 자바스크립트는 가비지 컬렉션을 통해 메모리 관리를 합니다. 객체가 참조 대상이 아닐 때, 가비지 컬렉션에 의해 자동으로 메모리 할당이 해제됩니다.
- function 내에 function이 있는 형태
함수 내에서 다른 함수(내부 함수)가 리턴이 되면, 이 함수를 클로져 함수라고 부르고, 외부 함수에 있는 변수에도 접근 가능
- ex code
let add = function (x) {
let sum = function (y) {
return x + y; // closure 특징 : 내부 익명 함수가 외부 익명 함수의 변수 x를 참조
}
return sum;
}
let foo = add(1);
let total = foo(6);
console.log(total) // 7
let multiplyByX = function (x) {
return function (y) {
return x * y; // closure : 내부 익명 함수가 multiplyByX function의 인자 5 참조
}
}
let multiplyBy5 = multiplyByX(5);
multiplyBy5(4);
console.log(multiplyBy5(4));
// 20
-커링 : function 하나가 n개의 인자를 받는 대신, n개의 함수를 만들어 각각 argument를 받게 하는 방법
function adder(x) {
return function(y) {
return x + y;
}
}
adder(2)(3); // 5
// 커링이 유용한 경우 : 특정 값을 고정해놓고 사용 가능
let add100 = adder(100);
add100(2); // 102
add100(10); // 110
let add5 = adder(5);
add5(2); // 7