[자바스크립트] 스코프와 변수 var,let,const 선언

crystal·2023년 1월 2일

자바스크립트

목록 보기
2/2

스코프

  • 스코프는 범위라는 의미를 가진다.
  • 스코프는 식별자(변수,함수,클래스)가 유효할 수 있는 범위를 의미한다.
  • 일반적으로 중괄호 또는 함수로 감싸진 영역을 의미한다.

스코프의 주요 규칙

  1. 안쪽 스코프에서 바깥쪽 스코프로 접근할 수 있지만 반대는 불가능하다.

    • 바깥쪽 스코프에서 선언한 식별자는 안쪽 스코프에서 사용이 가능하다.
    • 반면, 안쪽에서 선언한 식별자는 바깥쪽 스코프에서 사용할 수 없다.
  2. 스코프는 중첩이 가능하다.

  3. Local Scope와 Global Scope

    • Global Scope

      • Window 객체에 해당하는 부분
      • 모든 브라우저는 하나의 Global Scope를 갖는다.
      • 가장 바깥쪽의 스코프
    • Local Scope

      • 전역이 아닌 다른 스코프들
      • 중괄호 감싸진 영역에서 접근이 가능

    ⭐ 글로벌 스코프보다 우선순위가 높습니다.

  4. 지역변수는 전역변수보다 우선순위가 더 높다

    • 전역 스코프에서 선언한 변수는 전역 변수
    • 지역 스코프에서 선언한 변수는 지역 변수
    • 지역 변수는 전역 변수보다 더 높은 우선순위를 가진다.



스코프의 종류

- 스코프는 두가지 종류 블록 스코프와 함수 스코프가 있다.
- 화살표 함수는 함수 스코프가 아니다.



변수

  • 하나의 값을 저장하기 위해 확보한 메모리 공간 자체
  • 그 메모리 공간을 식별하기 위해 붙인 이름



변수 선언, 초기화, 할당

  • *변수 선언은 변수명을 등록하여 자바스크립트 엔진에 변수의 존재를 알리는 단계이고,
  • 초기화는 값을 저장하기 위해 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화하는 단계이다.
  • 마지막으로 할당 단계에서는 undefined로 초기화 된 메모리에 다른 값을 넣는 것입니다.



var, let, const의 차이에 대해 알려주세요.

image

  • var는 함수 스코프로 함수내에서 모든 변수에 접근이 가능하고, 변수가 선언되기 전에 코드에서 참조될 수 있습니다.

  • let, const는 블록 스코프로 블록 외부에서 접근이 불가능하며 초기화가 되기 전에는 코드를 참조할 수 없습니다.

  • 또한 let은 재할당이 가능하고, const는 재할당이 불가능합니다.

  • 요즘에는 var 대신에 let과 const를 주로 사용합니다. 왜냐하면 var의 경우에는 중복된 이름을 선언했을 경우에 오류사항이 나지 않으므로, 배포시에 위험성이 있기 때문입니다.


  • var : 변수 재선언, 재할당 모두 가능하다, 함수레벨 스코프

  • let : 변수 재선언은 불가능, 재할당 가능(immutable true), 블록레벨 스코프

  • const: 변수 재선언, 재할당 불가능(immutable false), 블록레벨 스코프


⚠️ const의 주의할 점
상수는 재할당이 안된다고 했지만, const로 된 객체의 속성들은 수정될 수 있다.

기본형과 참조형의 개념을 알아야 하는데, 간단하게 설명하면 원시값을 할당한 변수를 참조하면 메모리에 저장되어 있는 원시값에 접근한다. 하지만 객체를 할당한 변수를 참조하면 메모리에 저장되어있는 참조값을 통해 실제 객체에 접근한다.
원시값을 갖는 변수의 값을 변경하려면 재할당 외에는 방법이 없지만, 객체는 변경이 가능한 값이다. 따라서 객체를 할당한 변수는 재할당 없이 객체를 변경하는 것이 가능하다.
재할당 없이 프로퍼티를 동적으로 추가할 수도 있고, 프로퍼티의 값을 갱신할 수도 있으며 프로퍼티를 삭제할 수 도 있다.



스코프 변수 선언시 주의할 점

전역 객체(window)의 이해

  • Window 객체는 오직 브라우저에만 존재하는 객체이다.
  • 브라우저는 1개의 Window 객체만 가진다.
  • 브라우저의 창을 의미하는 객체이며 전역 영역을 담고 있다.
  • 함수 선언식으로 함수를 선언하거나 var로 변수를 선언하면 window 객체에 속하게 된다.

👇 전역에 var로 선언한 변수 a / 전역에 let으로 선언한 변수 b
image


👇 전역에 함수 선언식으로 등록한 함수 my()
image



전역 변수는 최소화하기

  • 가장 바깥 스코프에 정의한 변수가 전역 변수이다.
  • 즉, 어디서든 접근이 가능하다.
  • 전역 변수를 최소화하면 side effect를 줄일 수 있다.
  • var는 블록 스코프를 무시하고, 재선언과 재할당을 할수 있기 때문에 어디서든 접근이 가능하다.
profile
어제보다 더 나은 오늘의 내가 되자 ✧ʕ̢̣̣̣̣̩̩̩̩·͡˔·ོɁ̡̣̣̣̣̩̩̩̩✧ 

0개의 댓글