본문 바로가기
언어/자바스크립트(Java Script)

[자바스크립트] 스코프

by 골절문간신배신 2024. 7. 30.

*자바스크립트에서 스코프는 중요한 개념이므로 꼭 기억해야 함!

 

렉시컬 환경이란?

  • 렉시컬 환경은 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할을 하는 렉시컬 스코프의 실체임
  • 환경 레코드(Enviornment Record)와 외부 렉시컬 환경(상위 스코프)에 대한 참조로 이루어짐
  • 자바스크립트 엔진에 내장된 자료구조
  • environment record(환경 레코드)와 outer environment reference(상위 환경에 대한 참조)라는 프로퍼티를 가지는 형태로 구현됨

 


스코프란?

  • 선언한 변수의 적용 범위를 가르킴
  • 종류로는 함수 레벨 스코프, 블록 레벨 스코프가 있음
  • 하위 위치 내에선 상위 위치의 변수 등을 사용할 수 있지만, 상위 위치에서 하위 위치의 변수 등을 사용할 수 없으며, 형제 위치에서도 사용할수 없음

 

정적 스코프 vs 동적 스코프

  • 정적 스코프 (렉시컬 스코프)
    • 호출 스택과 관계없이 선언 시점에 상위 스코프를 결정
    • 자바스크립트는 정적 스코프의 특징을 가짐
  • 동적 스코프
    • 동적 스코프의 선언은 런타임 도중에 실행 콘텍스트나 호출 콘텍스트에 의해 결정
    • 함수를 어디서 호출했느냐에 따라 상위 스코프 결정!

함수(지역) 레벨 스코프

  • var 예약어로 선언한 변수는 함수 레벨 스코프를 가짐
    • 함수 내에서 변수를 선언했다면, 선언한 함수 내에서만 해당 변수를 사용할 수 있음 → 지역 스코프를 가짐
    • 함수 안에서 var 예약어를 빼먹고 변수를 선언하면, 전역변수로 인식이 됨
    • 프로그램 시작 부분에서 변수 선언 시 프로그램 전체에서 사용할 수 있음 → 전역 스코프를 가짐

var 변수와 호이스팅

  • 호이스팅
    • 자바스크립트 해석기가 함수 소스를 훑어보면서 변수를 따로 기억해 두기 때문에, 소스 상에서는 나중에 선언하더라도 내부적으로는 먼저 선언한 것 처럼 인식
    • 변수 호이스팅은 오류 없이 예상 못한 결과를 만드므로, var 변수를 쓸땐 호이스팅에 주의하기!

  • 참고로, let을 쓰면 그냥 오류 남

 


블록 레벨 스코프

  • let, const 예약어로 선언한 변수는 블록 레벨 스코프를 가짐
    • 자바스크립트에서의 블록은 중괄호{}로 둘러싸인 영역을 가리킴(함수, 조건문, 반복문)
  • 블록 레벨 스코프 : 블록별로 변수의 유효범위가 결정되는 것
  • let이나 const를 사용해 만든 변수는 변수가 선언된 블록 안에서만 유효함(블록 변수)

여기서 d의 위치에서 a,c를 불러오는건 되지만, a의 위치에서 d를 불러오거나, c의 위치에서 a,b,c를 불러오는건 안됨

 


바람직한 자바스크립트 변수 사용법

var 변수 보다는 let, const 변수를 사용하는 것이 좋음

  • 여러 사람이 함께 진행하는 프로젝트인 경우, 재선언 할 수 없고 호이스팅도 없는 let, const 변수 사용하는게 안전함!

 

전역변수는 최소한으로 사용하자

  • 가능하면 전역변수의 사용을 줄이고, 프로그램에서 값이 변하지 않는다면 const로 선언

 

객체 선언의 경우 const를 사용하자

  • 객체 선언 시 프로그램 중 객체 (주소) 자체가 바뀌지 않도록 const를 사용해서 선언
  • 객체를 const로 선언해도 객체 안에 있는 프로퍼티는 얼마든지 수정할 수 있음

 

* 가비지 컬렉션
- 자바스크립트는 도달 가능성(reachability) 이라는 개념을 사용해 메모리 관리를 수행함
- ‘도달 가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미함
- 도달 가능한 값은 메모리에서 삭제되지 않음

1. 아래의 값들은 그 태생부터 도달 가능하기 때문에, 명백한 이유 없이는 삭제되지 않음
(이런 값을 루트라고 부름)
- 현재 함수의 지역 변수와 매개변수
- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
- 전역 변수
- 기타 등등

2. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됨
- 전역 변수에 객체가 저장되어있다고 가정해 보았을 때, 해당 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이 됨
- 이 객체가 참조하는 다른 모든 것들도 도달 가능하다고 여겨짐

- 자바스크립트 엔진 내에선 가비지 컬렉터(garbage collector)가 끊임없이 동작함
- 가비지 컬렉터는 모든 객체를 모니터링하고, 도달할 수 없는 객체는 삭제함

(참고 포스팅 : 가비지 컬렉션)

 


참고 포스팅 : 렉시컬 환경 (Lexical Environment) / 스코프(scope) 용어정리

댓글