let, const와 블록 레벨 스코프

let

  1. 블록 레벨 스코프 블록 레벨 스코프(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
    
  2. 변수 중복 선언 금지

  3. 호이스팅

  4. 클로저

    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]();  
    }
    
  5. 전역 객체와 let

    var  foo  =  123;  // 전역변수  console.log(window.foo);  // 123
    
    let  foo  =  123;  // 전역변수  console.log(window.foo);  // undefined
    

const

  1. 선언과 초기화 let은 재할당이 자유로우나 const는 재할당이 금지된다.
    const는 반드시 선언과 동시에 할당이 이루어져야 한다.
  2. 상수
    const MAXROWS = 10;
    
  3. 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를 사용한다.