대부분의 경우에 let과 동일한 동작을 한다. 즉 let을 var로 바꾸어도 대부분의 케이스에서 정상적으로 동작할 것이다.
그러다보니, 블록 밖에서도 접근이 가능한 기이한 현상이 발생한다.
if (true) {
var test = true;
}
alert(test); // true(if 문이 끝났어도 변수에 여전히 접근할 수 있음)
if (true) {
let test = true;
}
alert(test); // Error: test is not defined
var user = "Pete";
var user = "John";
alert(user); // John
let user;
let user; // SyntaxError: 'user' has already been declared
function sayHi() {
phrase = "Hello"; //선언 하기 전 사용
alert(phrase); //여기도 사용
var phrase; // 선언
}
sayHi(); // Hello
var gVar = 5;
alert(window.gVar); // 5 (var로 선언한 변수는 전역 객체 window의 프로퍼티가 된다.)
(좌 : 책 예제 | 우 : let 예제)
function a(x){
console.log(x)
var x;
console.log(x);
var x = 2;
console.log(x)
}
a(1) // 1,1,2
function a(x){
console.log(x)
let x; //재 할당 에러가 난다.
console.log(x);
let x = 2;
console.log(x)
}
a(1) //The symbol "x" has already been declared
function a(){
console.log(b)
var b = "bbb"
console.log(b);
function b() {}
console.log(b);
}
a()
function a(){
console.log(b)
let b = "bbb"
console.log(b);
function b() {}
console.log(b);
}
a() //Uncaught SyntaxError: Unexpected identifier 'b'