모던 자바스크립트 Deep Dive - 24장 클로저

송히·2023년 11월 3일
0
post-thumbnail

24 클로저

  • 클로저: 자바스크립트 고유의 개념 아님,
    함수와 그 함수가 선언된 렉시컬 환경과의 조합

24.1 렉시컬 스코프

  • 렉시컬 스코프: 자바스크립트 엔진은 함수를 어디서 호출했는지가 아니라 함수를 어디에 정의했는지에 따라 상위 스코프를 결정함,
    "외부 렉시컬 환경에 대한 참조"에 저장할 참조값, 즉 상위 스코프에 대한 참조는 함수 정의가 평가되는 시점에 함수가 정의된 환경(위치)에 의해 결정됨

24.2 함수 객체의 내부 슬롯 [[Environment]]

  • 렉시컬 스코프가 가능하려면 함수는 자신이 호출되는 환경과는 상관없이 자신이 정의된 환경, 즉 상위 스코프를 기억해야함
    -> 함수는 자신의 내부 슬롯 [[Environment]]에 자신이 정의된 환경에 의해 결정된 상위 스코프의 참조를 저장
    -> 자신이 호출되었을 때 생성될 함수 렉시컬 환경의 "외부 렉시컬 환경에 대한 참조”에 저장될 참조값

24.3 클로저와 렉시컬 환경

  • 클로저: 외부 함수보다 중첩 함수가 더 오래 유지되는 경우 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있고, 이때의 중첩 함수를 의미
    -> 중첩 함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우에 한정하는 것이 일반적임

  • 자유 변수: 클로저에 의해 참조되는 상위 스코프의 변수
    -> 클로저는 "함수가 자유 변수에 대해 닫혀있다" 라는 의미 (자유 변수에 묶여있는 함수)

  • 자바스크립트 엔진은 최적화가 잘 되어 있어서 클로저가 참조하고 있지 않는 식별자는 기억하지 않음
    -> 클로저의 메모리 점유는 필요한 것을 기억하기 위한 것

24.4 클로저의 활용

  • 클로저는 상태를 안전하게 변경하고 유지하기 위해 사용함
    -> 상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용함

24.5 캡슐화와 정보 은닉

  • 캡슐화: 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것
    -> 정보 은닉 목적으로도 사용

  • 정보 은닉: 객쳬의 특정 프로퍼티나 메서드를 감출 목적으로 사용, 외부에 공개할 필요가 없는 구현의 일부를 감추어 적절치 못한 접근으로부터 객체의 상태가 변경되는 것을 방지해 정보를 보호, 객체 간의 상호 의존성인 결합도를 낮춤
    => 자바스크립트 객쳬의 모든 프로퍼티와 메서드는 기본적으로 외부에 공개되어 있음
    -> 단 한 번 생성되는 클로저이기 때문에 문제 발생 (변수의 상태가 유지되지 않는 것)

  • 자바스크립트는 정보 은닉을 완전하게 지원하지 않음
    -> TC39 프로세서의 stage 3에는 클래스의 private필드를 정의할 수 있는 새로운 표준 사양이 제안됨 (최신 브라우저, 최신 Node.js에 이미 구현 됨)## 24 클로저

  • 클로저: 자바스크립트 고유의 개념 아님,
    함수와 그 함수가 선언된 렉시컬 환경과의 조합

24.1 렉시컬 스코프

  • 렉시컬 스코프: 자바스크립트 엔진은 함수를 어디서 호출했는지가 아니라 함수를 어디에 정의했는지에 따라 상위 스코프를 결정함,
    "외부 렉시컬 환경에 대한 참조"에 저장할 참조값, 즉 상위 스코프에 대한 참조는 함수 정의가 평가되는 시점에 함수가 정의된 환경(위치)에 의해 결정됨

24.2 함수 객체의 내부 슬롯 [[Environment]]

  • 렉시컬 스코프가 가능하려면 함수는 자신이 호출되는 환경과는 상관없이 자신이 정의된 환경, 즉 상위 스코프를 기억해야함
    -> 함수는 자신의 내부 슬롯 [[Environment]]에 자신이 정의된 환경에 의해 결정된 상위 스코프의 참조를 저장
    -> 자신이 호출되었을 때 생성될 함수 렉시컬 환경의 "외부 렉시컬 환경에 대한 참조”에 저장될 참조값

24.3 클로저와 렉시컬 환경

  • 클로저: 외부 함수보다 중첩 함수가 더 오래 유지되는 경우 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있고, 이때의 중첩 함수를 의미
    -> 중첩 함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우에 한정하는 것이 일반적임

  • 자유 변수: 클로저에 의해 참조되는 상위 스코프의 변수
    -> 클로저는 "함수가 자유 변수에 대해 닫혀있다" 라는 의미 (자유 변수에 묶여있는 함수)

  • 자바스크립트 엔진은 최적화가 잘 되어 있어서 클로저가 참조하고 있지 않는 식별자는 기억하지 않음
    -> 클로저의 메모리 점유는 필요한 것을 기억하기 위한 것

24.4 클로저의 활용

  • 클로저는 상태를 안전하게 변경하고 유지하기 위해 사용함
    -> 상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용함

24.5 캡슐화와 정보 은닉

  • 캡슐화: 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것
    -> 정보 은닉 목적으로도 사용

  • 정보 은닉: 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용, 외부에 공개할 필요가 없는 구현의 일부를 감추어 적절치 못한 접근으로부터 객체의 상태가 변경되는 것을 방지해 정보를 보호, 객체 간의 상호 의존성인 결합도를 낮춤
    => 자바스크립트 객체의 모든 프로퍼티와 메서드는 기본적으로 외부에 공개되어 있음
    -> 단 한 번 생성되는 클로저이기 때문에 문제 발생 (변수의 상태가 유지되지 않는 것)

  • 자바스크립트는 정보 은닉을 완전하게 지원하지 않음
    -> TC39 프로세서의 stage 3에는 클래스의 private필드를 정의할 수 있는 새로운 표준 사양이 제안됨 (최신 브라우저, 최신 Node.js에 이미 구현 됨)

24.6 자주 발생하는 실수

  1. for 문의 변수 선언문에서 var 키워드로 선언하면 블록 레벨 스코프가 아닌 함수 레벨 스코프를 갖기 때문에 전역 변수가 됨
    -> let이나 const 키워드 사용하기: 이는 코드 블록을 반복 실행할 때마다 새로운 렉시컬 환경을 생성함

  2. 함수형 프로그래밍 기법인 고차 함수를 사용하는 방법: 변수와 반복문의 사용을 억제할 수 있기 때문에 오류를 줄이고 가독성을 좋게 만듦

24.6 자주 발생하는 실수

  1. for 문의 변수 선언문에서 var 키워드로 선언하면 블록 레벨 스코프가 아닌 함수 레벨 스코프를 갖기 때문에 전역 변수가 됨
    -> let이나 const 키워드 사용하기: 이는 코드 블록을 반복 실행할 때마다 새로운 렉시컬 환경을 생성함

  2. 함수형 프로그래밍 기법인 고차 함수를 사용하는 방법: 변수와 반복문의 사용을 억제할 수 있기 때문에 오류를 줄이고 가독성을 좋게 만듦

profile
데브코스 프론트엔드 5기

0개의 댓글