一.let var const的区别
1.var声明全局变量,作用域为全局。let、const具有局部作用域
let与const声明的变量,如果在其所在的代码块内声明,则在代码块外访问无效。var声明的变量,可以全局访问,代码块外也可以访问。
// es5中定义一个变量
function add(){
var a=12;//函数具有局部作用域
}
// console.log(a) 报错
if(true){
var b=2;//var具有全局作用域,在代码块外也可以访问。 在浏览器会被压到window全局里
let c=3;//let,const局部作用域,在代码块外不可以访问
const d=4;
console.log(c) //3
c=4 //let不可以重复声明,但可以重复初始化赋值
console.log(c) //4
}
console.log(b)//2
// console.log(c) 报错
// console.log(d) 报错
2.var存在变量声明提升,var声明的变量可在声明前使用,只是这种情况下值为undefined。let、const没有变量声明提升,只能在声明后使用,否则报错。
var a;//提升到作用域的最前面
console,log(a);//undefined
//var a = 3;
a = 3;
console.log(a); //3
// tem2=2;
// const tem2;
// console.log(tem2) //报错,const不会变量声明提升
3.
- var可以重复声明且重新赋值一个变量,后面覆盖前面。
- let不允许重复声明变量,否则报错。可以重复赋值
- const不可以重复声明和赋值。
const声明常量,一旦声明不可修改。(这个不可修改指的是 变量指向的内存地址不变,内存地址内保存的是实际指向数据的指针,const只能保证这个指针是固定的,即总是指向一个固定的地址。也就是不能把变量指向另一个地址,旦对象本身是可变的。)
4. let、const存在暂时性死区;var具有全局作用域,不存在暂时性死区。
// let const 暂时性死区
var tem=1;
if(true){
tem='ww';
//let tem; //在代码块内,使用let声明变量,在let之前该变量都是不可用的,这就是暂时性死区。tem赋值不会起作用,报错
}
console.log(tem)//ww
二.关于声明后变量值是否可以重复覆盖?
1.var 可以重复定义且重复赋值。
2.let 不可重复定义,但可以重复赋值。
3.const 不可重复定义,且不可重复赋值。