//ES5 code :: var>>
console.log(foo); //undefined
var foo;
console.log(foo); //undefined
foo = 123;
console.log(foo); //123
//ES6 code :: let>>
console.log(foo); //ReferenceError
let foo;
console.log(foo); //undefined
foo = 123;
console.log(foo); //123
let은유효범위의시작에서부터 선언 될때까지 temporary dead zone (일
시적사각지대)에있다. 이dead zone에서사용하게 되면
ReferenceError 가 발생한다.
let ‑ in for loop
let 으로정의된변수들은가장가까운블록으로scope이지정된다. 여기서
블록이란 if , else , for , while 같은문법으로지정된{ } 블록을의미
한다. let 키워드를사용한변수들은그들각각의함수block에귀속된다.
var 변수는함수의상단으로호이스팅(hoisting) 된다음에, 각 루프의반복
변수가 공유하게 된다. 그 결과, 콜백이실행될때는 i 변수가 루프의마지막
변수로할당된다. 즉콜백에서반복문을제어하는변수에접근할때문제가 발
생하는것이다. 이러한문제를해결하기 위해 let 을사용할수있다.
//ES5 code
function loadFiles( userNames ) {
for(var i in userNames){
_fetchProfiles(userNames[i], function() {
console.log(userNames[i]);
}
}
}
loadFiles(["A", "B", "C", "D"]);
console >
D // userNames[4]
D // userNames[4]
D // userNames[4]
D // userNames[4]
ES6 code
//ES6 code
function loadFiles( userNames ){
for( let i in userNames ){
_fetchProfile(userNames[i], function(){
console.log(userNames[i]);
}
}
}
loadFiles(["A", "B", "C", "D"]);
console >
A // userNames[1]
B // userNames[2]
C // userNames[3]
D // userNames[4]
let cannot be redeclared
let 으로정의된변수는같은블록에서재할당될수는있지만재정의는될수
없다.
//ES6 code
let a = 'hello';
a = 'world' // available
let a = 'hello';
let a = 'world'; // false -> TypeError : Identifier ‘a’ has alr
let flashMessage = 'hello';
function loadFiles(userNames){
let flashMessage = 'world'; // available
return flashMessage;
}
const ‑ declaration
const 키워드는상수라고 불리는읽기 전용변수를생성하는키워드이다. 한
번할당되면, 상수는새로운값으로할당될수없다. 명시적으로변경을시도해
도바뀌지않는다. const 로정의된변수는초기에정의할때, 반드시값을할
당해줘야한다. 그렇지않으면 Syntax Error 가 발생하게 된다. const 로
정의된변수는 let 과 마찬가지로, 가장가까운블록에scope이지정된다.