let :代码块内有效,相当于{}内有效,使用let声明的不存在变量声明提升,所以不能再定义前使用,即使再代码块外部有相同名的变量,也无法再里面提前使用
比如:
var one=10;
if(true){
console.log(one); //会报错,因为再这个代码块中,下面有let 声明one这个变量,所以不能这样用
let one=20;
console.log(one) //20
}
console.log(one) ; //10 因为再上面使用let定义的one只在上面那个代码块中有效,不影响外面的
这里说的代码块就是一个{}包起来的范围就是一个代码块
const:常量的声明,创建常量的时候必须赋值,否者会报错,常量创建后(地址)不可更改,就是说普通的数据类型不可以修改,复杂型数据再不修改其地址的情况下是可以被更改的
如:
const two=20;
two=10; // 报错,这样就等于改变了它原来指向的地址了
const arr=[1,2,3];
arr[1]=5; //这样修改不会有问题,因为没有修改arr地址的指向,所以ok
//函数也是如此
//总而言之:就是不能修改声明时常量指向的地址
let const var 的区别
1:挂载: 使用var声明的变量默认会挂载到window上,let和const不会
2:变量提升: 使用var声明的变量会有变量提升,let和const不会
3:块级作用域的产生: 使用let和const声明会形成块级作用域,只在当前块级作用域有效,使用var声明的不会产生块级作用域,只会有函数内和函数外的作用域
4:暂存死区: 如果再一个块级作用域给一个再当前作用于有使用let/const声明的同名变量提前赋值时,会报错 ;如下
var a = 100;
if(true){
a = 10;
//在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
// 而这时,还未到声明时候,所以控制台Error:a is not defined
let a = 1;
}
5:同名变量: 再同一代码块中,let/const不能声明同名变量,var可以