## let和var的区别
* let不会变量提升
* var会变量提升
~~~
console.log(example)
var example=1
~~~
它不会报错:
![](https://box.kancloud.cn/39bf885bf17b7a378c29a1aa0b84f6de_117x37.png)
如果是let
~~~
console.log(ex2)
let ex2=2
~~~
它会报错:
![](https://box.kancloud.cn/8f66223a202f1bec6ce9cd8c53ea3a43_271x49.png)
因为js在执行代码的时候,首先都会把var的变量提升到最顶部,然后在自己所在的位置再给他赋值,所以第一个不会报错,而Let的化,它不会提升所以会报错
## let的使用
* 一般情况下,使用Let都会放在封闭代码的顶部,以便整个代码块都可以访问
* 如果再统一执行环境下,var 一个变量 再同时let 一个同名变量会报语法错误
~~~
var count = 30;
let count = 40;
~~~
![](https://box.kancloud.cn/ad341cf32b1509f47d2d73abc42a5207_300x57.png)
* 但是在不同执行环境下就不会报错如:
~~~
var count = 30;
if(true){
let count = 40;
}
console.log(count)
~~~
![](https://box.kancloud.cn/17864fd290878b7bb5592d177479b53d_120x47.png)
由let 后面的变量一离开 {}代码块,就会立即被销毁,所以上面打印出来的值是30
## const
* const是常量,一旦声明了就无法更改
* const必须初始化(即必须赋初始值),不然会报错:
~~~
const age;
console.log(age)
~~~
![](https://box.kancloud.cn/a340c6cd7166fab25ea821c8e0e23443_302x41.png)
一般情况下要这么写:
~~~
const age = 10;
console.log(age)
~~~
* const和let一样,也是块级标识符,所以const 只在当前代码块内有效,一旦执行到块外,就会被销毁,同样const也不会被提升至作用域顶部
****
TDZ(临时死区)
与var 不同,let以及const 并不会变量提升,当Js引擎搜索变量声明时,要么把变量提升至作用域顶部(var),要么将声明放入临时死区,访问临时死区的变量就会触发运行错误:
如:
~~~
if(true){
console.log(typeof value);//引用错误
let value = "blue"
}
~~~
~~~
console.log(typfof value);//undefinded
if(true){
let value = 'blue'
}
~~~