9.2 通过 let 和 const 实现块级作用域
let 和 const 创建的变量都是块级作用域:它们只存在于包围它们的最深的代码块中。以下的代码表明了 let 声明的变量 tmp 仅仅存在于 if 声明内部。
function func() {
    if (true) {
        let tmp = 123;
    }
    console.log(tmp); // ReferenceError: tmp is not defined
}
相比之下,var 声明的变量是函数域:
function func() {
    if (true) {
        var tmp = 123;
    }
    console.log(tmp); // 123
}
块级作用域意味着你能在函数中重复声明变量(shadow variables):
function func() {
  let foo = 5;
  if (···) {
     let foo = 10; // shadows outer `foo`
     console.log(foo); // 10
  }
  console.log(foo); // 5
}