11. 클로저(Closure)

조뮁·2022년 7월 27일
0

JS중급

목록 보기
11/18
post-thumbnail

Closure

: 함수와 함수가 선언된 어휘적 환경 (Lexical scope)의 조합

  • 어떤 변수에 함수를 리턴하고 리턴한 함수 안에서 변수값을 저장하였다면 리턴하는 함수가 클로저를 형성함.
    • 해당 함수의 Lexical 환경에 변수가 저장되어있기 때문에, 함수 실행이 종료되어도 그 안에 있는 변수를 계속 사용할 수 있음.
    • 외부함수의 실행이 끝나서, 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근할 수 있음

Lexical 환경

: 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성

  • 함수의 Lexical 환경 : 넘겨받은 매개변수와 지역변수들이 저장됨










  • 상위함수의 Lexical 환경에 접근 가능
  • 함수가 생선된 이후에도 계속 접근 가능
  • 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도, 내부함수가 외부함수의 변수에 접근 가능

  • makeAdder(10)을 호출해도 add(3)에는 변화가 없음
    - add10과 add3은 서로 다른 환경을 가지고 있음

    각각의 Lexical환경은 서로 영향을 주지 않음


은닉화

function makeCounter(){
  let num = 0;
  
  return function(){ // 숫자반환, 외부함수의 변수 사용
    return num++;
  };
}

let counter = makeCounter();

console.log(counter());  // 0
console.log(counter());  // 1
console.log(counter());  // 2
  • 내부함수에서 외부함수의 변수(num)에 접근 가능
  • 외부함수의 변수를 계속 기억하고 있음 (Lexical scope에 저장되어 있기 때문에 계속 사용 가능)
  • num은 외부에서 변경할 수 없음. 오직 counter()로만 변경 가능.

0개의 댓글