---
# System prepended metadata

title: '[JS30]DAY2:JS and CSS Clock'

---

# [JS30]DAY2:JS and CSS Clock

:::info
:black_small_square:**目標：** 
:::

:::info
:black_small_square:**步驟流程**： 
:::
:::info
:black_small_square:**學習筆記：** :mega:
:::
## :after
## new Date()
## setInterval()
固定延遲了某段時間之後，才去執行對應的程式碼，然後「不斷循環」。 當然也會回傳一個獨立的 timer ID。
## setTimeout()
延遲了某段時間 (單位為毫秒) 之後，才去執行「一次」指定的程式碼，並且會回傳一個獨立的 timer ID。
## 取消setInterval()或setTimeout()
* ==**clearInterval()**== 來取消 setInterval()

* ==**clearTimeout()**== 來取消setTimeout()

但是setTimeout() 只會執行一次，所以 clearTimeout() 只會在 setTimeout() 指定的時間未到時才會有效果， 若 setTimeout() 的 callback function 已經被執行，那就等同是多餘的了。

:clipboard: 更多請參考：https://kuro.tw/posts/2019/02/23/%E8%AB%87%E8%AB%87-JavaScript-%E7%9A%84-setTimeout-%E8%88%87-setInterval/
## window.requestAnimationFrame(callback)
產生動畫可以使用這個，通常會根據 W3C 的建議符合多數瀏覽器重新整理的頻率。



##  IIFE 立即函式（Immediately Invoked Functions Expressions）
定義完馬上就執行的 JavaScript function。
:::warning
特性：
1. Grouping Operator () 包起來的 anonymous function。這樣的寫法可以避免裡面的變數污染到 global scope。
2. 馬上執行 function 的 expression ()，JavaScript 引擎看到它就會立刻轉譯該 function。
:::

範例：
X
```javascript=
// 假設想透過迴圈 + setTimeout 來做到
// 每秒鐘將 i 的值 console 出來

for( var i = 0; i < 5; i++ ) {
  window.setTimeout(function() {
    console.log(i);
  }, 1000);
}
```

O
```javascript=
for( var i = 0; i < 5; i++ ) {
  // 為了凸顯差異，我們將傳入後的參數改名為 x
  // 當然由於 scope 的不同，要繼續在內部沿用 i 這個變數名也是可以的。
  (function(x){
    window.setTimeout(function() {
      console.log(x);
    }, 1000 * x);
  })(i);
}
```
or

```javascript=
for( let i = 0; i < 5; i++ ) {
  window.setTimeout(function() {
    console.log(i);
  }, 1000 * i);
}
```
