有了let和const,有助于提升代码质量,因为变量有了明确的作用域,声明位置以及不变的值。使用const优先,let次之,const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作,只在提前知道未来会有修改时使用let,这样能迅速发现因意外赋值导致的非预期行为

3.3.1 var关键字

1.定义的变量会成为包含它的函数的局部变量 2.变量自动提升到函数作用域顶部,JS引擎会自动将多余的声明在作用域顶部合并为一个声明 3.在全局声明中会成为window对象的属性

3.3.2 let关键字

1.定义的变量会成为块作用域 2.变量不会提升到函数作用域顶部,如果在一个块中一件声明过再声明会报错 3.在全局声明中不会成为window对象的属性

  1. if(true){
  2. var name="matt";
  3. console.log(name)//matt
  4. }
  5. console.log(name)//matt
  6. if(true){
  7. let age="matt";
  8. console.log(age)//matt
  9. }
  10. console.log(age)//age no define

for循环中的let

var在退出循环时,迭代变量保存的是导致循环退出的值。在执行超时逻辑中,所有的都是一个变量,因而输出的都是同一个最终值。在使用let声明迭代变量时,JS引擎会在后台为每个迭代循环声明一个新的迭代变量。每个定时器引用的都是不同的变量实例

  1. for(var i=0;i<5;i++){
  2. setInterval(()=>{console.log(i)},1000)//5,5,5,5,5
  3. }
  4. console.log(i)//5
  5. for(let j=0;j<5;j++){
  6. setInterval(()=>{console.log(j)},1000)//1,2,3,4,5
  7. }
  8. console.log(j)//nodefine

3.3.3 const关键字

1.定义的变量会成为块作用域 2.变量不会提升到函数作用域顶部,如果在一个块中一件声明过再声明会报错 3.在全局声明中不会成为window对象的属性 4.声明时必须初始化变量,其后不能修改 5.如果变量引用的是一个对象,修改这个对象内部的属性并不违反const的限制 6.for中不能使用因为要变量自增,但可以在for-of/for-in中,相当于每次迭代创建一个新的变量