클로저와 커링

메론맛캔디·2021년 11월 5일
0

기술면접

목록 보기
15/30

클로저

클로저 : 반환된 내부함수가 자신이 선언되었을 때의 환경 스코프를 기억하여 자신이 선언되었을 때의 환경 밖에서 호출되어도 그 환경에 접근할 수 있는 함수를 의미한다.
자신이 생성될 때의 환경을 기억하는 함수 를 클로저라고 한다.

왜 클로저를 사용하는가?

  • 정보 은닉을 위해
  • 전역 변수의 사용을 억제하기 위해
  • 현재 상태를 기억하고 변경된 최신 상태를 유지하기 위해
const x = 1;

function outer() { // 1. outer 함수 객체의 상위 스코프가 할당된다.
	const x = 10;
  	const inner = function () {
    	console.log(x);
    }; // 2. outer 함수 호출로 outer 렉시컬 환경 생성 및 inner 함수 객체의 상위 스코프가 할당된다.
    return inner;
}

const innerFunc = outer(); // 3. outer 함수가 종료됨과 동시에 innerFunc에 의해 outer 렉시컬 환경이 참조된다.
innerFunc(); // 4. innerFunc 호출과 함께 innerFunc 렉시컬 환경이 만들어지고 실행 컨텍스트 스택에 올라간다.

커링

여러 개의 인자를 가진 함수를 호출할때, 파라미터 수보다 적은 수의 파라미터를 인자로 받으면 누락된 파라미터를 인자로 받는 기법이다. 함수 재사용성을 높일 수 있다.

function foo (a) {
  console.log('여긴 a', a)
  return function (b) { // 익명함수는 클로저가 된다.
    console.log(`a는 무엇일까 ${a}. b는 무엇 ${b}`)
    return function (c) {
    	console.log(`a는 무엇일까 ${a}. b는 무엇 ${b}. c는 무엇 ${c}`)
      return a + b + c
    }
  }
}

foo (1)(2)(3) // 6

처음 foo(1)이 호출되면 반환값으로 function(b) {...} 함수가 반환된다.
함수 내에서 a는 1로 기억된다. (실행된 환경을 기억한다)
그리고 2 파라미터와 함께 반환된 함수가 실행된다. 그리고 반환된 다음함수가 실행된다.
따라서 결과가 6이 나오게 된다.

const foo = (a) => (b) => (c) => a + b + c;

정리

클로저 : 자신이 생성될 때의 환경을 기억하는 함수이다.
(조금 더 디테일하게 설명하자면, 어떤 외부 실행 컨텍스트 A에 변수 ex 를 A의 내부 실행컨텍스트인 C 함수 실행 컨텍스트에서 변수 ex 를 사용하고 싶을 때, 실행컨텍스트 A가 콜스택에 존재하지 않아도 변수 ex를 계속 참조하고 있어 GC가 이루어 지지 않은 것.
주로 정보를 은닉할 때 사용한다.
생명주기가 종료된 외부 함수 식별자를 참조하는 것이 클로저의 본질이다.

클로저를 어디에 사용해봤나? : 커링 함수에서 사용한다.

커링 : 인자가 여러개인 함수를 호출할 때, 파라미터 수보다 적은 수의 파라미터를 인자로 받으면 누락된 파라미터를 인자로 받는 기법



참조

https://yceffort.kr/2020/03/javascript-currying-closure

https://sunnykim91.tistory.com/121

0개의 댓글