let

  1. 변수 중복 선언 금지

    var foo = 123;
    var foo = 456;
    
    let bar = 123;
    let bar = 456; // SyntaxError: Identifier 'bar' has already been declared
    
  2. 블록 레벨 스코프

    let foo = 1;
    
    {
    	let foo = 2;
    	let bar = 3;
    }
    console.log(foo); // 1
    console.log(bar); // ReferenceError: bar is not defined
    

    var vs let

    // var
    var i = 10;
    
    function foo() {
    	var i = 100;
    	for (var i = 1; i < 3; i++) {
    		console.log(i); // 1 2
    	}
    	console.log(i); // 3
    }
    
    console.log(i); // 10
    
    // let
    let i = 10;
    
    function foo() {
    	let i = 100;
    	for (let i = 1; i < 3; i++) {
    		console.log(i); // 1 2
    	}
    	console.log(i); // **100**
    }
    
    console.log(i); // 10
    
  3. 변수 호이스팅

    console.log(foo); // ReferenceError: foo is not defined
    let foo;
    

    왜 let 키워드로 선언한 변수는 호이스팅이 발생하지 않는 것처럼 동작할까?

  4. 전역 객체와 let

    var x = 1;
    y = 2;
    
    function foo() {}
    
    console.log(window.x); // 1
    console.log(x); // 1
    console.log(window.y); // 2
    console.log(y); // 2
    
    let x = 1;
    
    console.log(window.x); // undefined