let 和 const 命令
let和const都是用来声明变量的ES6新增了块级作用域
- 任何带有花括号
{}的,就是一个块级作用域- 像
while(){}、if(){}、for(){}、function(){}等等 
 - 像
 - 在块级作用域中,变量由
let和const声明的话,该变量在块级作用域外,访问不到 
- 任何带有花括号
 - 函数声明位置的问题
- ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
- 但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数
 
 - ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。
- ES6 规定,块级作用域之中,函数声明语句的行为类似于
let
```javascript // 案例二 // ES5时,经常使用匿名立即执行函数(IIFE),避免变量声明重复,而导致相互覆盖影响 // 块级作用域的出现,使得IIFE不再必要// 案例一{let a = 5;console.log(a); // 5}console.log(a); // 报错。相当于未声明变量,就使用变量
 
 - ES6 规定,块级作用域之中,函数声明语句的行为类似于
 
 - ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
 
// IIFE 写法 (function(){ var a = 456; })() // 块级作用域的写法 { let a = 456; }
```javascript// 案例三// ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。// 第一种写法,报错if (true) let x = 1;// 第二种写法,不报错if (true) {let x = 1;}
// 案例四function f() { console.log('I am outside!'); }(function () {if (false) {// 重复声明一次函数ffunction f() { console.log('I am inside!'); }}f();}());// 浏览器是 ES5 的环境下,相当于function f() { console.log('I am outside!'); }(function () {// 变量提升function f() { console.log('I am inside!'); }if (false) {}f(); // 打印出I am inside!}());// 浏览器是 ES6 的环境下,相当于function f() { console.log('I am outside!'); }(function () {var f = undefined;if (false) {function f() { console.log('I am inside!'); }}f();}());// Uncaught TypeError: f is not a function
let 的特点
- 使用
let命令声明的变量,不存在变量提升 
即要求变量一定要在声明后使用,否则报错
// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;
使用
let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)if (true) {// TDZ开始tmp = 'abc'; // ReferenceErrorconsole.log(tmp); // ReferenceErrorlet tmp; // TDZ结束console.log(tmp); // undefinedtmp = 123;console.log(tmp); // 123}
不允许重复声明
// 报错{let a = 1;let a = 2;}// 报错{var a = 1;let a = 2;}
const 的特点
let的三个特点,const也有- 另外,
const在声明时必须赋值,否则报错 
