## let和var的區別
* let不會變量提升
* var會變量提升
~~~
console.log(example)
var example=1
~~~
它不會報錯:

如果是let
~~~
console.log(ex2)
let ex2=2
~~~
它會報錯:

因為js在執行代碼的時候,首先都會把var的變量提升到最頂部,然后在自己所在的位置再給他賦值,所以第一個不會報錯,而Let的化,它不會提升所以會報錯
## let的使用
* 一般情況下,使用Let都會放在封閉代碼的頂部,以便整個代碼塊都可以訪問
* 如果再統一執行環境下,var 一個變量 再同時let 一個同名變量會報語法錯誤
~~~
var count = 30;
let count = 40;
~~~

* 但是在不同執行環境下就不會報錯如:
~~~
var count = 30;
if(true){
let count = 40;
}
console.log(count)
~~~

由let 后面的變量一離開 {}代碼塊,就會立即被銷毀,所以上面打印出來的值是30
## const
* const是常量,一旦聲明了就無法更改
* const必須初始化(即必須賦初始值),不然會報錯:
~~~
const age;
console.log(age)
~~~

一般情況下要這么寫:
~~~
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'
}
~~~