---
# System prepended metadata

title: var、let、const 的差異?
tags: [六角JS 直播班 - 2021 秋季班]

---

###### tags: `六角JS 直播班 - 2021 秋季班`
var、let、const 的差異?
===

# var
var可以重複宣告，相較於let較不嚴謹，未來若程式碼一多可能會導致程式碼難以維護。

在作用域內宣告的var，在作用域內才有作用，如果是在function外宣告的var，則會被視為全域變數。

<br>

>### var可能有的副作用

- **只存在在特定區塊中**
```javascript=
function func (){
    var a =1;
    console.log(a); //1

}
func()
console.log(a) //在外層抓不到在函式func內名稱為a的var變數 Uncaught ReferenceError: a is not defined
```
- **可以被重複宣告，也可以被重新賦予值**

```javascript=
#example1

var a = 1;
var a = 2;

console.log(a); //2 第一個var變數會被第二個覆蓋掉

#example2

var a = 1

function func (){
    var a = 2;
    console.log(a); //2
}
func();
console.log(a); //1
//有兩個相同名稱的var變數卻不會報錯，雖然名稱相同但被視為兩個完全不同的變數
```

- **循環變數洩漏為全域變數**
```javascript=
var i = 10

for(var i = 0; i<5; i++){
    console.log(i); //0 1 2 3 4
}

console.log(i); //應為10，卻印出5
```


- **離開作用域，在外層仍可取出值**
```javascript=
for (var i=0; i<5; i++){
console.log(i); //0 1 2 3 4
}
console.log(i); //5
```

# let

在ES6後取代var，為較嚴謹的宣告方式。
const 可不可以修改？
A1：基礎型別不行，但物件型別可以。

B1：const 僅限制無法修改 `value`（無法重新賦予值），但可以修改 `reference` 原物件的值。
Q2：如何讓 reference 不能被修改？
A2：使用 freeze()，防止 const 的 property 被更動。

>### let的特性
- **僅能宣告一次，且可以被重新賦予值**
```javascript=
let a = 1
let a =2
console.log(a) // 不能重複宣告 Uncaught SyntaxError: Identifier 'a' has already been declared
```
```javascript=
let a = 1
a=2
console.log(a) // 2 可以被重新賦予值，不需要再宣告一次
```

- **離開作用域，外層無法取出值**
```javascript=
for (let i=0; i<5; i++){
console.log(i); //0 1 2 3 4
}
console.log(i); //Uncaught ReferenceError: i is not defined

```

# const
同為較嚴謹的宣告方式，需初始化，不可重複宣告，用來宣告不易變動的值。
>### const的特性
- **需初始化**
```javascript=
const a;
a=1
console.log(a); //Uncaught SyntaxError: Missing initializer in const declaration
```
- **僅能宣告一次，不可被重新賦予值**
```javascript=
const a = 1;
const a = 2;
console.log(a); //Uncaught SyntaxError: Identifier 'a' has already been declared
```
```javascript=
const a = 1;
a = 2;
console.log(a); // Uncaught TypeError: Assignment to constant variable.
```

<br>


>**參考資料:**
>[JavaScript: var, let, const 差異](https://totoroliu.medium.com/javascript-var-let-const-%E5%B7%AE%E7%95%B0-e3d930521230)
>[JavaScript 那個 let, const, var 到底差在哪？](https://www.youtube.com/watch?v=FGdKdn_CnWo)