11. Blocklevel scope of the let, const keyword

변수 선언에 const, let을 사용해야 하는 이유

index

var 키워드로 선언한 변수의 문제점

let 키워드

const 키워드



1. var 키워드로 선언한 변수의 문제점

🤪 1.1 변수 중복 선언 허용

var 키워드로 선언한 변수는 중복 선언이 가능하다.

var x = 1;
var y = 1;

// var 키워드로 선언된 변수는 스코프 내 중복 선언을 허용한다.
// 초기화 문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
var x = 100;
// 자바스크립트 엔진이 변수를 다시 선언하지만, 값의 변경이 없으면 무시한다.
var y;

console.log(x); // 100
console.log(y); // 1



🤪 1.2 함수 레벨 스코프

var 키워드로 선언한 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정한다. 따라서 함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역변수가 된다.

1. if 

var x = 1;

if (true) {
  var x = 10;
}

console.log(x); // 10
2. for 

var i = 10;

for (var i = 0; i<5; i++) {
  console.log(i); // 0 1 2 3 4
}

console.log(i); // 5


🤪 1.3 변수 호이스팅

var 키워드로 변수를 선언하면 변수 호이스팅에 의해 변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작한다.
즉, 변수 호이스팅에 의해 var 키워드로 선언한 변수는 변수 선언문 이전에 참조할 수 있다.
단, 할당문은 이전에 변수를 참조하면 언제나 undefined를 반환한다.

//1. 선언단계, 이 시점에는 변수 호이스팅에 의해 이미 foo 변수가 선언되었다.
// 2. 초기화 단계, 변수 foo는 undefined로 초기화된다.
console.log(foo);

// 3. 할당단계, 변수에 값을 할당한다.
foo = 123;

console.log(foo);

var foo;


🤪 1.4 var 키워드로 선언한 전역변수와 전역함수, 암묵적 전역

var 키워드로 선언한 전역변수와 전역함수, 그리고 선언하지 않은 변수에 값을 할당한 암묵적 전역은 전역 객체 window의 프로퍼티가 된다.

var x = 1; // var 키워드로 선언한 전역변수
y = 2; // 선언하지 않은 변수에 값을 할당한 암묵적 전약
function foo() {} // 전역함수

// var 키워드로 선언한 전역변수는 전역 객체 window의 프로퍼티다.
console.log(window.x); // 1
console.log(x); // 1

// 암묵적 전역은 전역 객체 window의 프로퍼티다.
console.log(window.y);
console.log(y);

// 전역함수는 전역 객체 window의 프로퍼티다.
console.log(window.foo);
console.log(foo);



2. let 키워드

😁 2.1 변수 중복 선언 금지

let 키워드로 이름이 같은 변수를 중복 선언하면 문법에러(syntaxError)가 발생한다.

let foo = 123;

let foo = 456; // syntaxError: Identifier 'foo' has already been defined
// let이나 cosnt 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용되지 않는다.


😁 2.2 블록 레벨 스코프

let 키워드로 선언한 변수는 모든 코드 블록(함수, if문, for문, while문, try/catch문 등)을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.

let foo = 1; // 전역변수

{
  let foo = 2; // 지역변수
  let bar = 3; // 지역변수
}

console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined


😁 2.3 변수 호이스팅

let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는다.

console.log(foo); // undefined

var foo;
console.log(bar); // ReferenceError: bar is not defined

let foo;
Photo of difference of Keyword declaration

var & let keyword

Jay Tak.



3. const 키워드

😁 3.1 선언과 초기화

const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다.

const foo; // syntaxError: Missing initializer in const declaration


😁 3.2 재할당 금지

const 키워드로 선언한 변수는 재할당이 금지된다.

const foo = 1;
foo = 2; // TypeError: Assignment t constant variable


😁 3.3 대문자로 상수임을 명확하게

const TAX_RATE = 0.1;

let preTaxPrice = 100;

let afterTaxPrice = preTaxPrice + (preTaxPrice = TAX_RATE);

console.log(afterTaxPrice); // 110


😁 3.4 객체일 경우 변경가능

변경 불가능한 값인 원시 값은 재할당 없이 변경 할 수 있는 방법이 없지만 변경가능한 객체는 재할당 없이도 직접 변경이 가능

const person = {
  name: "Lee",
};

person.name = "Kim";

console.log(person); // {name: "Kim"}




reference: 모던자바스크립트 Deep Dive 15장. let, const 키워드의 블록 레벨 스코프