나 이것도 몰랐네..

자바스크립트 4 - 스코프와 클로저 본문

언어/자바스크립트

자바스크립트 4 - 스코프와 클로저

SuhyeokRoh 2024. 3. 29. 00:03

스코프(Scope)

참조 대상 식별자를 찾아내기 위한 규칙
  • 모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위를 결정
  • 스코프는 전역 스코프(Global Scope)와 지역 스코프(Local Scope)로 나뉨
구분 설명 스코프 변수
전역 코드의 가장 바깥 영역 전역 스코프 전역 변수
지역 함수 몸체 내부 지역 스코프 지역 변수
  • 변수는 자신이 선언된 위치에 의해 자신이 유효한 범위인 스코프가 결정

스코프 체인

스코프가 함수의 중첩에 의해 계층적으로 연결된 것을 의미
  • 함수 몸체 내부에서 정의된 함수를 "중첩 함수(nested function)", 중첩 함수를 포함하는 함수를 "외부 함수(outer function)"이라 부름
  • 변수를 참조할 때, 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색
렉시컬 환경(Lexical Environment)
- 코드가 어디서 실행되며 주변에 어떤 코드가 있는지를 의미
- 코드의 문맥은 렉시컬 환경에서 이뤄지며, 이를 구현한 것이 실행 컨텍스트(execution context)
- 모든 코드는 실행 컨텍스트에서 평가되고 실행됨
  • 상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조 가능하지만 하위 스코프에서 유효한 변수는 상위 스코프에서 참조할 수 없음

렉시컬 스코프(Lexical Scope)

상위 스코프가 동적으로 변하지 않고, 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되는 것
정적 스코프(Static Scope)라고도 부름

클로저(Closure)

외부 함수보다 중첩 함수가 더 오래 유지되는 경우,이미 생명 주기가 종료된 외부 함수의 변수를 참조할 수 있는 중첩 함수를 의미
  • 함수는 자신의 내부 슬롯 [[Environment]]에 자신이 정의된 환경, 상위 스코프의 참조를 저장
    • 함수 객체는 내부 슬롯 [[Environment]]에 저장된 렉시컬 환경의 참조를 자신이 존재하는 한 기억함
  • 외부 함수가 종료되어도 내부 슬롯 [[Environment]]에 저장된 렉시컬 환경의 참조를 통해 접근

클로저의 활용

  1. 상태를 안전하게 변경하고 유지하기 위해 사용
    • 모듈 내부 로직의 노출을 최소화하여 정보를 은닉
    • 변수에 대한 접근 권한을 제어할 수 있음
  2. 부분 적용 함수
    • n개의 인자를 받을 함수에 미리 m개의 인자를 넘긴 후, 나중에 나머지 인자를 넘겨 원래 함수 실행 결과를 얻는 것
  3. 커링
    • 단일 호출로 처리하는 함수를 각각의 인자가 호출 가능한 프로세스로 호출된 후 병합되도록 변환하는 것
    • 주로 지연 실행에 사용됨

 


참고 페이지
https://velog.io/@chojs28/%EB%A0%89%EC%8B%9C%EC%BB%AC-%EC%8A%A4%EC%BD%94%ED%94%84%EC%99%80-%ED%81%B4%EB%A1%9C%EC%A0%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%BB%A4%EB%A7%81

 

렉시컬 스코프와 클로저, 그리고 커링

MDN에 클로저의 정의는 ‘함수와 함수가 선언된 어휘적 환경의 조합이다’ 라고 나타나 있다.그리고 클로저를 이해하려면 렉시컬 스코프(Lexical Scope)를 먼저 이해해야 한다고 나와있다.따라서,

velog.io