第一:块级范围内
var变量提升(不存在以下的问题)
let块级作用域,指定块的外部无法访问
const常量声明块级作用域,不会发生变量提升,声明后不可以改变因此需要初始化.(对于一个对象而言不可改变是指引用不可变,内容可以改变相当于java的final关键字)
1:禁止重复声明
2:暂时性死区
3:不在块级作用域范围内使用按照undefined处理
console.log(typeof value)//因为发生在块级作用域外面,不会因为暂时性死区而崩溃
if(true){
let value = "blue"
}
第二:循环范围内
1:let没有任何问题
2:var循环中的使用
var funcs = [];
for(var i=0;i<10;i++){
funcs.push(functiong(){console.log(i)})
}
func.forEach(function(func){
func()
});
因为变量i在循环的每次迭代中都被共享了 因此最后调用后的值会是打印10此10
3:循环内的常量声明
const在for循环中使用时第一次正常运行第二次i++时,会因为试图修改常量报错;
const能够在for-in与for-of循环内工作,因为循环为每次迭代创建了一个新的变量绑定而不是去试图修改已绑定的变量值。
第三:全局范围内
1:var会覆盖掉之前存在的同名属性,let和const不会污染全局属性
总结:
默认情况下应该使用const,只有知道变量需要被改变时才使用let,这样预期外的改动都可以算作是bug处理。
网友评论