作用域不同
var是函数作用域
函数内部声明了var,整个函数内都是有效的,比如,在for循环内定义一个var变量,实际上在for循环外意思可以访问的
for(var x=0;x<5;x++){
//
}
console.log(x) //5
x结果为 5 因为for内部循环到4,外部再此访问变量x时,因为var声明的x是全局变量,通过变量提升到了for循环外部,所以跳出循环后值为5
let是块级作用域 比如在for循环内用let声明变量,,在器外部是不可以访问的。
for(let x=0;x<5;x++){
//
}
console.log(x) //Uncaught ReferenceError: x is not defined
x值报错:Uncaught ReferenceError: x is not defined
定义之前访问
let不能在定义之前访问访问该变量,但是var可以。即let必须先定义再使用,而var则可以,只是var未定义使用,其值为underfined。
console.log(x) // underfined
var x
console.log(y) // Uncaught ReferenceError: Cannot access 'x' before initialization
let y
let不能被重新定义,var可以
function Num(){
console.log(x)
}
var x = 3;
Num(); //3
var x = 4;
Num(); //4
function Num(){
console.log(x)
}
let x = 3;
Num()
let x = 4;
Num(); // Uncaught SyntaxError: Identifier 'x' has already been declared
小结:从规范角度来说,更推荐let,const这些