有了let和const,有助于提升代码质量,因为变量有了明确的作用域,声明位置以及不变的值。使用const优先,let次之,const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作,只在提前知道未来会有修改时使用let,这样能迅速发现因意外赋值导致的非预期行为
3.3.1 var关键字
1.定义的变量会成为包含它的函数的局部变量 2.变量自动提升到函数作用域顶部,JS引擎会自动将多余的声明在作用域顶部合并为一个声明 3.在全局声明中会成为window对象的属性
3.3.2 let关键字
1.定义的变量会成为块作用域 2.变量不会提升到函数作用域顶部,如果在一个块中一件声明过再声明会报错 3.在全局声明中不会成为window对象的属性
if(true){
var name="matt";
console.log(name)//matt
}
console.log(name)//matt
if(true){
let age="matt";
console.log(age)//matt
}
console.log(age)//age no define
for循环中的let
var在退出循环时,迭代变量保存的是导致循环退出的值。在执行超时逻辑中,所有的都是一个变量,因而输出的都是同一个最终值。在使用let声明迭代变量时,JS引擎会在后台为每个迭代循环声明一个新的迭代变量。每个定时器引用的都是不同的变量实例
for(var i=0;i<5;i++){
setInterval(()=>{console.log(i)},1000)//5,5,5,5,5
}
console.log(i)//5
for(let j=0;j<5;j++){
setInterval(()=>{console.log(j)},1000)//1,2,3,4,5
}
console.log(j)//nodefine
3.3.3 const关键字
1.定义的变量会成为块作用域 2.变量不会提升到函数作用域顶部,如果在一个块中一件声明过再声明会报错 3.在全局声明中不会成为window对象的属性 4.声明时必须初始化变量,其后不能修改 5.如果变量引用的是一个对象,修改这个对象内部的属性并不违反const的限制 6.for中不能使用因为要变量自增,但可以在for-of/for-in中,相当于每次迭代创建一个新的变量