// 1. 기본 선언
let name = 'yeseul';
console.log(name);
name = 'kimyeseul';
console.log(name);
// 콘솔창 출력 결과
// yeseul
// kimyeseul
// 2. Block scope :
{
let name = 'yeseul';
console.log(name);
name = 'kimyeseul';
console.log(name);
}
console.log(name);
// 콘솔창 출력 결과
// yeseul
// kimyeseul
//
// 3. Global scope
let globalName = 'global name';
{
console.log(globalName);
}
console.log(globalName);
// 콘솔창 출력 결과
// global name
// global name
console.log(age); // 선언도 전에 출력할 수 있음
age = 4; // 선언도 전에 값을 할당할 수 있음
console.log(age); // 4 출력
var age;
// 콘솔창 출력 결과
// undefined
// 4
// 만약 let이었다면? Error!!
name = 4;
let name;
// 콘솔창 출력 결과
// Uncaught ReferenceError: Cannot access 'name' before initialization
// name이라는 변수를 선언하기도 전에 값을 넣어 오류 메세지 출력
let a = 5;
let a = 6; // Error! (a는 이미 정의되어 있다)
// but, var...
var a = 5;
var a = 6; // 에러가 나지 않는다.
console.log(a); // 6
var를 사용하면 안되는 이유
- 중복 선언 문제
- var hoisting (move, declaration from bottom to top)
: hoisting이란 어디에 선언했냐에 상관없이 항상 파일 제일 위로 선언을 끌어올려주는 것- has no block scope : 블록 스콥이 없다
: block을 철저히 무시하고 블록 안에서 선언한 값이 밖에서 출력되는 현상이 발생
예제 코드
var a = 10;
var a = 20;
: 호이스팅이란 자바스크립트 실행 이전에 평가 과정에서 선언부를 상단부로 끌어올려 먼저 저장하는 것이다. var의 경우 아래에서 선언해도 선언부가 먼저 저장되어 실행 시에 선언된다. 할당되지 않아도 undefined라는 값을 갖고 있고, 이러한 현상이 마치 선언부가 상단에 올라오는 효과 같다고 해서 hoisting이라는 이름으로 불리고 있다.
console.log(a); // a is not defined : error
let a;
// 해당 경우에는 선언이 되지 않았다는 에러를 뱉는 게 정상이다.
// 그러나 var는...
console.log(a); // undefined
var a;
// 이렇게 호이스팅이 되는 것!
var a;
console.log(a);
has no block scope 예제 코드
{
age = 4;
var age;
}
console.log(age);
// 콘솔창 출력 결과
// 4
// 반면 let에서 동일 문 사용의 경우
{
let age;
age = 4;
}
console.log(age);
// 콘솔창에 어느 값도 출력되지 않는다!
let
과 const
의 도입으로 블록 스코프에서 변수를 격리하고 변수 노출을 제한하여 코드의 가독성을 향상시키고 예기치 못한 변수 충돌을 방지할 수 있다.var의 호이스팅 문제 어떻게 해결할까?
ES6(ES2015), ECMAScript 에서
let
과const
를 추가하여 중복 선언 및 호이스팅을 개선하였다.
const daysInWeek = 7;
// daysInWeek = 10; // Error 재할당할 수 없습니다.
const maxNumber = 5;