var

대부분의 경우에 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'