es6 let&const
说明
ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。
let 声明的变量只在 let 命令所在的代码块内有效。
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
一、 var 声明
- 声明提前(变量提升)
 - 可以重复声明
 - 可在全局或函数作用域下声明
 
console.log(value);
var value = 1;
function fun1() {
  var value = 10;
}
二、 let 声明
- 不可以声明提前
 - 不可以重复声明(同一作用域下)
 - 有块级作用域
 for(let i;;){},在 for 的小括号声明,也属于块级作用域中
1. 不可以声明提前
console.log(a); //ReferenceError: a is not defined
let a = "apple";
console.log(b); //undefined
var b = "banana";
2. 不可以重复声明(同一作用域下)
let a = 1;
let a = 2;
var b = 3;
var b = 4;
a; // Identifier 'a' has already been declared
b; // 4
3. 有块级作用域
//代码块 for(){}  while(){}
{
  let i = 3; //在这个代码块中定义
}
// console.log(i);  // 报错 i未定义
 4. for(let i;;){},在 for 的小括号声明,也属于块级作用域中
for (var k = 0; k < 5; k++) {
  setTimeout(() => {
    console.log(k);
  }, 100);
}
//输出结果 5,5,5,5,5
for (let k = 0; k < 5; k++) {
  //k在块级作用域中
  setTimeout(() => {
    console.log("let", k);
  }, 100);
}
//输出结果 0,1,2,3,4
for (var j = 0; j < 5; j++) {
  //es5, 使用闭包保存变量,从而隔绝绝对全局变量的访问
  (function(j) {
    setTimeout(() => {
      console.log("es5", j);
    }, 100);
  })(j);
}
三、 const 声明
- 不可声明提前
 - 不可重复定义
 - 不可重复赋值
 - 必须声明同时赋值
 - 和 let 一样有块级作用域
 
?> 实战: 有变量名避免冲突可以使用let和const, 如果是某些不需要改变只提供方法的对象,可以使用const声明
const MAX = {
  value: 100
};
console.log(MAX);
MAX.value = 200;
{
  const MIN = 0;
  console.log("const", MIN);
}
console.log("const", MIN); //报错,未定义