scope

유효범위(scope)가 없다고 하면 좀 모호하고 이전에는 전역, 지역 단위로 유효범위가 정해졌다고 한다면 ECMAScript 2015에서는 블록 단위로 처리됩니다. 예를 들어 아래와 같은 코드는 오류 없이 처리됩니다.

function f() {
  if(true){
    var j = 10;
    console.log(j); //10
  }
  console.log(j); //10
}
f();

하지만 let 구문을 사용하는 경우에는 전혀 다른 결과가 나타납니다. 같은 함수 범위내에서 선언된 변수를 인식하지 못하는 것이죠.

function f() {
  if(true){
    let j = 10;
    console.log(j); //10
  }
  console.log(j); //Uncaught ReferenceError: j is not defined
}
f();

참고로 호이스팅이나 유효범위 관련해서 잘 정리된 자료가 있습니다. 물론 ES6는 적용하지 않은 자료입니다. http://www.nextree.co.kr/p7363/

ES6 관련해서는 이 자료가 괜찮네요. 그림으로 비교해놓으니 이해가 쉽다는... https://www.codementor.io/javascript/tutorial/es6-template-strings-destructuring-function-arguments

The Global & Function Scope

Block Scopes