# let, const, var 的差異|筆記 by Sz
###### tags: `Sz` `課前` `Vue新手夏令營`
- [Vue 新手夏令營 課程頁面](https://hackmd.io/@dbFY0UD9SUeKmNXhWf01ew/BkJoW-hn_/%2FC05go-8iTSS-nrMwKU22kA)
- [:sun_with_face:筆記入口](/2JiZbCPdR0G4p5fNycPmTg)
::: warning
嘿嘿我這篇還在建置中,看不懂正常,我也看不懂,但改完還是可能會看不懂,救命
:::
::: info
- 為什麼要宣告變數
- 避免全域、區域污染
- 屬性與變數的差異
- 屬性可以被刪除 (a = 1)
- 變數無法被刪除 (var a = 1)
:::
# 辭法作用域
````
// var 作用域在程式碼寫完的當下就確定了
// #1
var a = '全域';
function fnA() {
console.log('a = ' + a); // a = 全域
}
function fnB() {
var a = 'local';
fnA(); // a = 全域
console.log('a = '+ a); // a = local
}
console.log(a) // a = 全域
````
## var 的特性
### function 作用域
- 在 function 內的 var,上層讀不到
- 在 {}(block) 內的 var,上層讀得到
### for...
- for 設定的 var,執行後的外層會讀到結果
- 設定 var 變數的 for 內部若有 setTimeout() ,也會跟迴圈一樣執行同等次數,但都是最終結果(非同步,目前還搞不懂為什麼要這麼用)
### hoisting
## let 與 var 的差異
### 作用域不同 var function, let block
- **let 的作用域只在內部**
- **設定 let 的 for 內部若有** setTimeout() ,則不會在 for 執行完後才執行,會正常顯示 for 迴圈
- 不會在 window 上
### 不可重複宣告
````
var a = 1;
var a = 0; // 可
````
````
let a = 1;
let a = 0; // 不可
a = 0; // 可
````
### hosting
- 暫時性失去
- function 已經從外部傳入參數時,又在內部重新宣告 let 參數的話,function 內部重新宣告前該參數會暫時性失去
### const 與 let 不同之處
````
// 不可重複覆值
const a = 1;
a = 2; // 不可
````
### 陷阱 const 與 let 的選擇
- const 不可重複
### 但 const 內有物件
- 物件的屬性是可以改的(物件傳參考)
- 但直接改const 成其他物件是不行的(物件傳參考)
## 其他
- undefined 跟 not undefined
````
var a // a = undefined
// a is not undefined
````
- debugger