---
# System prepended metadata

title: Untitled

---


## 1.
* a. 因為變數 i 是使用 var ，scope 在全域下，在 setTimeout 執行到時，變數已經加到 5了。
* b. setTimeout 沒有 delay 的功能，在迴圈執行時，會把所有 setTimeout的 callback 放入 event loop 的機制下，因為所有 callaback 都是 1000ms，故會在1000ms 後一次顯示。
* c. 使用 Promise 的功能即可簡單達到功能。
```javascript
async function func() {
  for (let i = 0; i < 5; i++) { 
    await new  Promise((resolve) => {
      setTimeout(() => {
        console.log(i);
        resolve()
      }, 1000)
    })
  }

}

func()
```
## 2. 
* a. 
ans: false
* b. 
ans: true

## 3.


 a. 不一定，因為經過 event loop 的機制下，可能會受到其他 callback 阻塞的影響，setTimeout 並不是監聽時間執行 callback 的方式。
 
 ## 4
 
 ```javascript
 function random6(n) {
  if (n < 6) {
    return null
  }
  const results = []
  const map = {}

  function pickNum() {
    return 1 + Math.floor(Math.random() * n)
  }

  while ( results.length < 6) {
    const num = pickNum()

    if (!map[num]) {
      map[num] = 1
      results.push(num)
    }
  }

  return results
}

 ```
 
 ## 5 
 
 在 React map 的情況使用 key 是為了減少不必要的 Render，在 key 相同時重複的組件會盡可能不做 ReRender，而 index 有可能因為陣列數量的更動產生可能可以減少的浪費，像是使用 id 的話，一般就能確定資料是同一份。
 
 ## 6
 
 1. 原生方式 React Context，不過Context 比較適合依賴注入，不適合大量 State 更動。
 2. Redux，React 生態下狀態管理工具，一般的使用上比較不會如 Context 一般造成太多 Side Effect。
 3. 其他狀態管理工具，可能如 Mobx，有些 Observable 的方式也有共享狀態，但不會造成太多ReRender 的方案。
 
 ## 7
 
 1. CDN
 2. 減少初始內容前端渲染的需求(SSR or LazyLoad)
 3. 確認圖片是否壓縮
 4. 確認是否有不必要的 DOM 變動、擠壓，產生 reflow repaint
 