클로저는 외부 함수의 변수에 접근할 수 있는 내부 함수, 또는 이러한 작동 원리를 일컫는 용어이다.
다음의 예제를 보자.
function outerFunc() {
let outerVal = 2;
function innerFunc() {
let innerVal = 1;
return globalVal + outerVal + innnerVal;
}
return innerVal;
}
let globalVal = 3;
let innerF = outerFunc();
innerF();
innerFunc()
가 바로 클로저 함수이다. 클로저 함수에서는 지역변수(innerVal
), 외부 함수의 변수(outerVal
), 전역 변수(globalVal
)에 모두 접근할 수 있다.
함수에 n개의 인자를 받는 대신, n개의 클로저 함수를 만들어 각각 인자를 받게 하는 방법이다.
다음의 함수를 보자
function multiply(x, y, z){
return x, y, z;
}
console.log(multiply(3, 5, 7)); // 3*5*7
console.log(multiply(3, 5, 8)); // 3*5*8
console.log(multiply(3, 2, 1)); // 3*2*1
multiply()
의 첫번째 인자는 모두 3이며, 3*5*7
과 3*5*8
은 두번째 인자가 5이다. 그러나 이 함수에서는 그때그때 모든 인자를 직접 지정해주어야 한다.
이럴 때 커링을 이용해 특정 인자를 재사용할 수 있게 만들 수 있다.
function multiply(x) {
return function(y) {
return function(z){
return x*y*z;
}
}
}
let multiply3 = multiply(3); // 3이 고정됨
let multiply3And5 = multiply3(5); // 3과 5가 고정됨
let multiply3And2 = multiply3(2); // 3과 2가 고정됨
console.log(multiply3And5(7));
console.log(multiply3And5(8));
console.log(multiply3And2(1));
클로저 함수의 외부 함수 변수의 값을 고정시킨 함수를 리턴한다.
커링은 클로저와 완전히 별개인 무언가가 아니라, 클로저의 특징을 이용한 기법으로 볼 수 있다. 특히, 클로저의 외부 함수 변수의 값을 고정할 수 있다는 점에서 유용하다.