var存在变量提升,可以在声明之前使用,值为undefined。 而let和const在声明之前使用会报错。
console.log(a) //undefined var a = 1 ; console.log(b) //ReferenceError: g is not defined let b = 2; console.log(c) //ReferenceError: g is not defined const c = 2;在相同作用域内,let和const不允许重复声明,var 允许重复声明。
var a = 1; var a = 2; console.log(a) //2 let b = 3; let b = 4; console.log(b) //SyntaxError: Identifier 'g' has already been declared const c = 5; const c = 6; console.log(c); //SyntaxError: Identifier 'g' has already been declaredlet和const存在暂时性死区,var不存在
var tmp = 123; if(true){ tmp = "abc"; // ReferenceError let tmp; //报错 } //以上代码if后面{}形成了块级作用域,由于使用let声明了tmp,则这个变量就绑定了块区域,在声明之前使用,会报错。ES6中新增了块级作用域。块级作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。 1.解决内层变量可能覆盖外层变量的问题 2.不存在变量提升,变量存在于块级作用域之中。
var不存在块级作用域。let和const存在块级作用域。