241028 클로저

수달·2024년 10월 28일

✔️ 복습

  • 스코프: 변수에 접근할 수 있는 범위, 식별자(변수)를 찾기 위한 규칙
  • 스코프 체인

💫
https://doozi0316.tistory.com/entry/JavaScript-Scope%EB%9E%80-%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B2%B4%EC%9D%B8-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8

  • 실행 컨텍스트:
    자바스크립트 코드가 실행되기 위해서 필요한 환경을 제공하는 객체(Object)
    레코드(Record)와 아우터(Outer)로 구성
    레코드는 환경 레코드를 말하며, 자바스크립트 코드의 선언문을 기록해두는 공간을 가리키는 객체

  • 환경 레코드:
    내부적으로 생성 단계와 실행 단계라는 두 가지 단계를 거쳐서 실행
    생성 단계에서는 현재 컨텍스트의 선언문을 환경 레코드에 기록
    실행 단계는 생성 단계에서 기록된 환경 레코드를 참조해서 코드를 실행하거나 업데이트

  • 렉시컬 스코프(정적 스코프):
    함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정되는 것
    함수를 어디서 선언하였는지에 따라 상위 스코프를 결정
    함수의 호출이 아니라 함수의 선언에 따라 결정
    하나의 실행 컨텍스트에서 환경 레코드와 아우터를 하나로 묶어서 렉시컬 스코프

  • 아우터(Outer):
    바깥 렉시컬 스코프를 참조하는 객체
    아우터를 통해서 외부에 있는 식별자를 참조 가능
    아우터에 의해서 바깥 렉시컬 스코프를 참조할 수 있는 현상을 스코프 체인
    참조해 나가는 것을 스코프 체이닝

클로저

  • 함수와 그 함수가 선언된 렉시컬 환경의 조합
  • 함수가 선언된 시점의 변수를 기억하고, 그 변수를 참조할 수 있게 해줌
  • 함수가 선언된 시점의 렉시컬 환경을 기억
  • 데이터 은닉과 캡슐화를 가능하게 함 -> 데이터의 무결성을 유지하고, 불필요한 접근을 방지
  • ex) 자바스크립트의 함수형 프로그래밍에서 자주 사용되며, 콜백 함수나 이벤트 핸들러 등

💫
https://f-lab.kr/insight/understanding-closures-and-garbage-collection-in-javascript-20240605

1. 가비지 컬렉터

1.1 메모리에서 더 이상 사용되지 않는 객체를 자동으로 감지하고, 해당 메모리를 회수하여 메모리에서 삭제해주는 시스템

2. 가비지 컬렉션

  • 메모리가 회수되는 과정, 더 이상 사용되지 않는 메모리(더 이상 참조되지 않는 객체)를 자동으로 해제하는 프로세스 -> 메모리 누수를 방지, 프로그램의 안정성 높임

2.2 가비지 컬렉션을 자동으로 수행한다. 왜? 실행컨텍스트가 콜스택에서 제거가 될 때
2.3 자동으로 수행이 되지 않는 경우 -> 그 컨텍스트의 레코드 값이 참조 중일 때

3. 메모리가 쌓이다. 쓸데 없는 -> 메모리 누수

4. 클로저

4.1 내부 함수에서 외부 변수를 참조하면서 반환되는 경우
4.2 자유 변수를 참조하는 내부 함수를 반환하는 것
4.3 가비지 콜렉션의 대상이 되지 못 하고 메모리 제거가 되지 못 해서 메모리에 남아있는 현상 -> 클로저

  1. 클로저 사용할 일 거의 없음
    5.1 클로저는 위험해요 -> 메모리가 자동으로 삭제된다는 것
    5.3 클로저가 많으면 ? -> 회수되자 메모리 많아진다는 것 -> 자바스크립트와 가비지콜렉터 시스템을 위협하는 행위
    5.3 내부함수에서 자유 변수를 가리키고 있는 함수를 의미
    5.4 -> 주로 캡슐화가 필요한 로직에 사용

  2. 클로저 사용 패턴
    6.1 캡슐화 -> 은닉화
    6.2 함수 팩토리(특정 기능을 하는 함수를 고정할 떄)

  3. 비동기 프로그램

동기? 비동기?
동기 언어 -> 특정 코드가 실행되는 것을 기다려줌
비동기적으로 코드를 실행할 수 있게 해줌

메모이제이션

  • 계산 결과를 재사용
  • 복잡한 계산을 캐시하여 성능을 향상

💫
https://1yoouoo.tistory.com/28
https://f-lab.kr/insight/javascript-closure-and-memoization

0개의 댓글