- 자바스크립트는 기본적으로 함수 내부에서 선언된 변수를 외부에서 접근할 수 없다.
- 함수 내부의 변수는 함수의 실행이 끝나면 메모리 할당이 해제되기 때문이다.
- 하지만 일급객체의 속성으로 변수에 할당된 함수는 곧바로 할당이 해제 되지 않고, 이때 함수 내부의 변수의 값 역시 남아있게 된다.
🥘 일급객체는 변수에 할당될 수 있으며, 다른 함수의 인자로 사용될 수 있고, 다른 함수의 결과로서 리턴될 수 있다.
- 함수 내부에서 이 선언된 변수에 접근할 수 있는 함수를 클로저 라고 한다.
- 이 클로저를 통해서 Java의 객체의 private 함수처럼 외부에서 메서드를 통해서만 변경이 가능한 함수 내부의 변수를 만들 수 있다.
const closure = () => {
let count = 0;
function showCount(){
// 내부함수이며 클로저
return count;
}
function counting(){
// 역시 내부함수이며 클로저, 함수 내부의 변수를 바꾼다.
count++;
}
// showCount();
// 만든 함수는 바로 실행하거나 리턴하여 사용하여야 한다.
return {
// 만든 여러개의 함수를 외부에서
// 사용할 수 있도록 객체로 반환
showCount : showCount,
counting : counting,
}
}
count1 = closure();
count2 = closure();
console.log(count1.showCount(), count2.showCount());
// 0 0 출력
count1.counting() // count1 함수의 count값만 변경
console.log(count1.showCount(), count2.showCount());
// 1 0 출력
🍬 Currying은 함수의 인자를 클로저 함수로 받는 것이다.
// 일반적인 함수
function sum (a, b) {
return a + b;
}
console.log(sum(1 , 2));
// 커링
function multiply (x) {
return function (y) {
return function (z) {
return x * y * z;
}
}
}
const first = multiply(-1);
const second = first(3);
const third = second(10);
console.log(third); // -30