---
# System prepended metadata

title: let、const的實戰運用
tags: [' const', let]

---

---
title: let、const的實戰運用
tags: let, const, 
description:
---
let、const的實戰運用
---

### let

setTimeout是==非同步執行程式==。

非同步事件會==先放在==事件儲列，等所有程式碼==都執行完之後，才來執行==。


```javascript=
for (var i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(`是第${i}次執行`);
  }, 100);
}
```

![](https://i.imgur.com/KPExPrX.png)


`setTimeOut`作用域在`for迴圈`內，但是`var i`作用域是在全域。
等到`for迴圈`運行結束後，==才取到全域變數```i```的值==，而不是for迴圈當下運行的```i```。

<br>
<br>

把```var```改成```let```後，```i```不是全域變數，==作用域被限制在block大括號內==，

因此setTimeOut便==可依序取得i的值==。
```javascript=
for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(`是第${i}次執行`);
  }, 100);
}
```

---
### const
因為物件是==傳參考==特性。

因此宣告const物件變數，只要==不替換整個物件的內容==，只修改屬性的值是沒問題的。
```javascript=
const person = {
  name: 'John',
  wallet: 500,
}
person.name = 'max';
```
![](https://i.imgur.com/gDNgqFH.png)

<br>

使用```Object.freeze()```，可將==物件的屬性凍結，無法修改屬性值==。
```javascript=
const person = {
  name: 'John',
  wallet: 500,
}
person.name = 'max';
Object.freeze(person);
person.wallet = 1000;
```
![](https://i.imgur.com/gDNgqFH.png)
