클로저(Closure)

citron03·2022년 1월 8일
0

html, css, js

목록 보기
9/43
  • 자바스크립트는 기본적으로 함수 내부에서 선언된 변수를 외부에서 접근할 수 없다.
  • 함수 내부의 변수는 함수의 실행이 끝나면 메모리 할당이 해제되기 때문이다.
  • 하지만 일급객체의 속성으로 변수에 할당된 함수는 곧바로 할당이 해제 되지 않고, 이때 함수 내부의 변수의 값 역시 남아있게 된다.
    🥘 일급객체는 변수에 할당될 수 있으며, 다른 함수의 인자로 사용될 수 있고, 다른 함수의 결과로서 리턴될 수 있다.
  • 함수 내부에서 이 선언된 변수에 접근할 수 있는 함수를 클로저 라고 한다.
  • 이 클로저를 통해서 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
profile
🙌🙌🙌🙌

0개의 댓글