Koras02
Koras02코딩웹
Koras02
전체 방문자
오늘
어제
  • 분류 전체보기 (299)
    • 백엔드 (59)
      • nestjs (2)
      • Ruby (3)
      • PostgresQL (11)
      • MySQL (5)
      • Haskell (7)
      • Koa (3)
      • Java (3)
      • Python (5)
      • Rust (5)
      • MongoDB (2)
      • PHP (3)
      • Spring Boot (1)
      • redis (5)
      • deno (2)
    • 웹서버 (3)
      • nginx (1)
      • Apache (2)
      • Google Web Server (0)
    • 모바일개발 (5)
      • Figma (0)
      • React Native (2)
      • swift (0)
      • Flutter (3)
      • Kotlin (0)
    • 프론트 엔드 (158)
      • HTML (34)
      • CSS (7)
      • Javascript (35)
      • Angular (0)
      • Typescript (2)
      • React (58)
      • Vue (2)
      • GIT (6)
      • GraphQL (1)
      • Doker (4)
      • Go (8)
      • svelte (1)
      • gatsby (0)
    • etc. (47)
      • Notion (0)
      • TIL (24)
      • Algorithm (17)
      • Algorithm 개념 정리 (2)
      • Wiki (3)
      • Official document (1)
    • 웹개념 (12)
    • 변수정리 (1)
    • VSCode (2)
    • 포트폴리오 분석 (2)
      • React (2)
    • os (5)
      • 윈도우 (4)
      • Mac (0)
      • 가상머신 (0)
      • linux (1)
    • 응용프로그램언어 (2)
      • C (2)
      • C++ (0)
      • C# (0)
    • 블로그 운영관련 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
글쓰기

공지사항

  • [공지사항] 개발 이슈나 공식문서 업데이트 업로드 예정입니⋯

인기 글

태그

  • 알고리즘
  • Rust
  • PostgreSQL
  • go
  • Java
  • html5
  • 문자열
  • koa
  • 프로그래머스
  • mysql
  • html
  • React
  • 데이터 타입
  • 하스켈
  • javascript
  • CSS
  • redis
  • Til
  • Haskell
  • Flutter

티스토리

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.
Koras02

Koras02코딩웹

변수 타입 (var, let, const)와 스코프 연산자(scope) 개념
프론트 엔드/Javascript

변수 타입 (var, let, const)와 스코프 연산자(scope) 개념

2022. 1. 21. 09:43
728x90

var, let, const 의 차이

  • var은 function scope(함수블록 {}이외 모든 변수는 전역 변수)이고 
    let과 const는 block scope(모든 코드 블록 -if, for 등에서 선언된 변수는 해당 코드 블록 내에서만 유효)임
  • var은 재선언 및 재할당이 가능하고, hoisting이 가능하다.
  • var은 초기값이 없으면 자동으로 undefined를 초기값으로 메모리 할당하므로 에러가 발생하지 X
  • let은 한번 선언 한 후로는 재선언이 불가능하다. 다만 재할당은 가능, const는 상수로서 변하지 않는 값이기에
    재선언 및 재할당이 불가능하다.
  • let & const는 hoisting이 불가능(Template Dead Zone이 선언과 초기화 사이에 생긴다.)
  • 단, const로 변수선언을 하더라도, object 자체 변경은 불가능하지만, 내부의 속성 및 값 변경은 가능하다.

요약

👉 const 키워드

  • 유효 범위: 블록 스코프 / 함수 스코프
  • 값 재할당: 불가능
  • 재선언: 불가능 

👉 let 키워드

  • 유효 범위: 블록 스코프 / 함수 스코프
  • 값 재할당: 가능 
  • 재선언: 불가능

👉 var 키워드

  • 유효 범위: 블록 스코프 / 함수 스코프
  • 값 재할당: 가능
  • 재선언: 가능
for (let i = 0; i < 10; i++) {
  console.log(i);
}

// 전역 스코프에서 선언한 변수 i는 존재하지도 않기에 
// RefenceError 가 발생한다.
console.log(i)
  • 블록 스코프 안에서는 let과 const 키워드로 선언한 변수는 스코프 안에서만 참조가 가능하다
  • 그런데 var 키워드로 선언한 변수는 블록 스코프를 무시하고 스코프 울타리 밖에서도 접근이 가능.
    (단 var은 오직 함수 스코프만 따른다.)
for (var i = 0; i < 10; i++) {
  console.log(i)
}

// var 키워드로 선언한 변수 i 는 지역 스포프에서 선언되었지만 모든 스코프에 접근이 가능하다.
console.log(i) // 9
  • var키워드로 선언한 변수는 오직 함수 스코프만 따른다.

변수 타입별 Scope의 차이

  • scope는 변수의 유효범위이다.
  • 유효범위를 결정하는 두 가지 요소로 프로그래밍 구문만으로 유효범위를 정하는 lexical scope와 프로그램
    실행 중에 유효범위를 지정하는 dynamic scope가 있다. (lexical scope는 함수를 호출할 때가 아닌 함수를
    선언할때 scope가 발생하는 개념)
  • JS 변수는 변수의 유효범위에 따라서 전역변수와 지역변수로 나눈다.
  • scope chain은 내부함수부터 외부로 단계적으로 변수를 찾아가는 순서이다.(내부함수에서 외부함수의
    변수에 접근 가능하지만, 외부함수에서 내부함수 변수에 접근할 수 없다.)

스코프와 관련한 변수 선언시 주의점

👉  전역 객체(window)의 이해

  • Window 객체는 only 브라우저에만 존재하는 객체이다.
  • 브라우저의 창(window)를 의미하는 객체이다.
  • 그런데 별게로 전역 영역을 담고 있기도 하다.
  • 그래서 함수 선언식(function declearation) 으로 함수를 선언하거나 var키워드로 변수를 선언하면 
    window 객체에 속해진다.

👉 전역 변수는 최소화 하기 

  • 가장 바깥 스코프에 정의한 변수가 전역변수이다.
  • 즉, 어디서든 접근이 가능하다.
  • 전역 변수를 최소화 하면 side effect(의도하지 않은 로직에 의한 문제 발생)을 줄일 수 있다.
  • 그런데 그러한 전역 변수를 var을 이용해 선언하는 경우도 문제가 발생할 수 있다.
    • 전역 변수는 어디서나 접근이 가능
    • var키워드는 block scope(블록 스코프)를 무시
    • 재선언 & 재할당 가능
    • 전역 변수를 var로 선언해 브라우저 내장 기능을 못하게 만들수 있다.

👉 선언 없는 변수 할당 금지

  • 선언 없이 변수를 할당하면 해당 변수에는 var로 선언된 전역 변수처럼 취급한다.
  • 실수를 방지하기 위해 Strict Mode(엄격한 모드)를 사용하자.
    • Strict Mode는 브라우저 보다 더 엄격한 모드에서 작동할 수 있도록 도와준다.
    • "선언 없는 변수 할당"의 경우도 에러로 판단해준다.
    • 적용하기 위 .js파일 상단에 "use strict" 라고 입력하면 된다. 

 

참고 자료

 

변수 타입(var, let, const)과 스코프(scope) 개념

var는 function scope(함수블록 {}이외에는 모든 변수는 전역변수)이고 let과 const는 block scope(모든 코드 블록-if, for 등에서 선언된변수는 해당 코드 블록 내에서만 유효)임참고링크var는 재선언 및 재할

velog.io

 

[JavaScript] 스코프(Scope)와 변수 선언 (var, let, const 키워드 차이점) - 하나몬

⚡️ 스코프(Scope) 스코프(Scope)라는 영어 단어 자체는 ‘범위’라는 의미를 가진다. 컴퓨터 공학, 그리고 JavaScript 에서도 ‘범위’의 의미를 가지고 있다. JavaScript 에만 국한된 개념은 아니다.  

hanamon.kr

 

'프론트 엔드 > Javascript' 카테고리의 다른 글

[Javascript] Javascript와 Node.js의 차이  (0) 2022.01.23
[Javascript] Javsacript ES6 주요 특징  (0) 2022.01.20
[Javascript] 자바스크립트: '==' 와 '==='는 다르다!  (0) 2022.01.20
    '프론트 엔드/Javascript' 카테고리의 다른 글
    • [Javascript] null과 undefined의 차이
    • [Javascript] Javascript와 Node.js의 차이
    • [Javascript] Javsacript ES6 주요 특징
    • [Javascript] 자바스크립트: '==' 와 '==='는 다르다!
    Koras02
    Koras02
    현재 사용중인 언어 - next-js,react,vue, typescript

    티스토리툴바