let, const와 블록 레벨 스코프
let
블록 레벨 스코프 블록 레벨 스코프(Block-level scope)
모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
let foo = 123; // 전역 변수 { let foo = 456; // 지역 변수 let bar = 456; // 지역 변수 } console.log(foo); // 123 console.log(bar); // ReferenceError: bar is not defined
변수 중복 선언 금지
호이스팅
클로저
var funcs = []; // 함수의 배열을 생성하는 for 루프의 i는 전역 변수다. for (var i = 0; i < 3; i++) { (function(index) { // index는 자유변수다. funcs.push(function() { console.log(index); }); }(i)); } // 배열에서 함수를 꺼내어 호출한다 for (var j = 0; j < 3; j++) { funcs[j](); }
var funcs = []; // 함수의 배열을 생성하는 for 루프의 i는 for 루프의 코드 블록에서만 유효한 지역 변수이면서 자유 변수이다. for (let i = 0; i < 3; i++) { funcs.push(function () { console.log(i); }); } // 배열에서 함수를 꺼내어 호출한다 for (var j = 0; j < 3; j++) { console.dir(funcs[j]); funcs[j](); }
전역 객체와 let
var foo = 123; // 전역변수 console.log(window.foo); // 123
let foo = 123; // 전역변수 console.log(window.foo); // undefined
const
- 선언과 초기화
let은 재할당이 자유로우나 const는 재할당이 금지된다.
const는 반드시 선언과 동시에 할당이 이루어져야 한다. - 상수
const MAXROWS = 10;
- const와 객체
const 변수의 타입이 객체인경우, 재할당은 불가능하지만 할당된 객체의 내용은 변경할 수 있다.
const user = { name: 'Lee' }; // const 변수는 재할당이 금지된다. // user = {}; // TypeError: Assignment to constant variable. // 객체의 내용은 변경할 수 있다. user.name = 'Kim'; console.log(user); // { name: 'Kim' }
var vs. let vs. const
- ES6를 사용한다면 var 키워드는 사용하지 않는다.
- 재할당이 필요한 변수에는 let을 사용한다.
- 변경이 발생하지 않는(재할당이 필요 없는) 원시 타입과 객체 타입에는 const를 사용한다.