首先我们要知道在 javaScrip中的var ,let (es6新增),const(es6新增) 都是声明变量的方式。
let const 语法和 var一样都是用来声明变量的
1.var 声明的变量是存在变量提升的,let ,const声明的变量不存在变量提升。
变量提升:
变量提升是指代码在未定义之前可以使用且不会报错
console.log(a); //undefined 在没有定义之前使用a代码不报错 值为undefined
var a = 100; //使用var声明的变量存在变量提升
function fn(){
}
let a = 100; //Cannot access 'a' before initialization 不能在a未定义之前使用
let b
console.log(b);//undefined*/
预解析:
JS代码在运行之前,先解析当前作用域中的所有代码,获取所有被声明的变量进行预处理。
2.在同一作用域下var可以重复声明,let,const不可以重复声明。
var a = 10;
var a = 12; //不会报错后声明的变量会覆盖前面的变量
let a = 10;
let a = 12; //Identifier 'a' has already been declared ==> a这个变量已经被创建(定义过了)
const a = 10
const a = 15 //Identifier 'a' has already been declared ==>标识符“a”已经声明
3.var声明的变量不存在块级作用域 let,const声明的变量存在块级作用域。
js中的作用域 全局作用域 函数作用域 块级作用域(ES6新增)
作用域链:
在局部作用域(函数作用域/块级作用域)中访问一个变量,如果这个作用域不存在这个变量,那么根据作用域链查找的原则,会一层层向上查找,知道找到最顶层作用域(全局作用于)为止,如果还找不到 就会报错 xxx is not defined
//块级作用域 ES6新增作用域 块级作用域 一个{ }表示一个块级作用域
var a = 2;
for (var a = 0;a<10;a++){
}
console.log(a); //10
var a = 2;
for (let a = 0;a<10;a++){
}
console.log(a); //2
4.var和let可以重新赋值 const声明的是一个常量,const声明的变量必须要进行初始化 不能够重新赋值 。
var a = 1;
a=2; //不会报错
let b = 1;
b = 100; //不会报错
const c = 1;
c =100; //Assignment to constant variable. ==>const声明的是一个常量 不能够重新赋值*/
5.var声明的变量不存在暂时性死区,let,const声明的变量存在暂时性死区。
暂时性死区:
在变量声明之前,任何的地方都不能去提前使用,一旦使用就会报错,那么这之前的这些代码,对于这个变量来说就是暂时性死区
const i = 1
{
//死区开始
console.log(i) //死区里边拿不到外边的i,也拿不到本代码块内的i
//死区结束
const i = 2
console.log(i) //直到这里才能正常使用 i
}
总结:
1.var 声明的变量是存在变量提升的,let ,const声明的变量不存在变量提升。
2.在同一作用域下var可以重复声明,let,const不可以重复声明。
3.var声明的变量不存在块级作用域 let,const声明的变量存在块级作用域。
4.var和let可以重新赋值 const声明的是一个常量,const声明的变量必须要进行初始化 不能够重新赋值 。
5.var声明的变量不存在暂时性死区,let,const声明的变量存在暂时性死区。