2024-11-14 為什麼碼錶程式 要用到 setInterval() ? 它並沒有時間的概念
2024-11-14 為什麼碼錶程式 要用到 setInterval() ? 它並沒有時間的概念
所以為什麼碼錶程式 要用到 setInterval() ? 它並沒有時間的概念
碼錶程式需要用到 setInterval()
的原因,雖然它本身並不處理「時間的概念」,但它依賴的是 setInterval()
提供的「週期性執行能力」,來模擬碼錶的計時功能。讓我們一步步解析原因。
1. setInterval()
的核心功能
setInterval()
的作用是 每隔一定的時間執行一次指定的操作。- 在碼錶程式中,我們需要每隔一段時間(例如 10 毫秒)更新碼錶的數值,使畫面上的數字看起來像是在「計時」。
2. 為什麼碼錶需要更新顯示?
碼錶程式的主要功能是:
- 展示經過的時間。
- 不斷刷新顯示,讓人看到時間在變化。
如果沒有 setInterval()
:
- 無法讓顯示的數值自動更新。
- 用戶就無法看到時間的流逝。
3. 模擬碼錶的例子
沒有 setInterval()
的情況
如果不使用 setInterval()
或類似的方式,碼錶的數值必須手動更新:
1 | let time = 0; |
這樣碼錶就無法持續顯示變化,用戶體驗會很差。
使用 setInterval()
模擬碼錶
使用 setInterval()
的碼錶程式如下:
1 | let time = 0; |
結果:
- 程式會自動在每 10 毫秒執行一次時間更新,直到停止為止。
- 這讓碼錶看起來像是在「計時」。
4. 碼錶程式的需求分析
- 時間持續增加:碼錶需要模擬「經過的時間」。
- 解決方法:將每次間隔的時間(如 10 毫秒)加到總時間
time
中。
- 解決方法:將每次間隔的時間(如 10 毫秒)加到總時間
- 畫面自動更新:用戶希望看到「動態的時間」。
- 解決方法:使用
setInterval()
讓時間持續刷新。
- 解決方法:使用
5. 碼錶程式用到 setInterval()
的具體用途
在 Vue 的碼錶程式中,setInterval()
的用途主要是:
**更新數據 (
this.time
)**:- 程式碼:
this.time += 10;
。 - 每 10 毫秒執行一次,使時間數據不斷增加。
- 程式碼:
觸發 Vue 的響應式更新:
- 透過 Vue 的響應式系統,當
this.time
改變時,自動觸發畫面更新,顯示最新時間。
- 透過 Vue 的響應式系統,當
6. 如果不用 setInterval()
,可以用什麼?
雖然 setInterval()
是實現碼錶的常用方式,但也可以考慮以下替代方案:
**
setTimeout()
**:- 每次執行後再次設定下一次執行,這樣可以更精確地控制執行時間:
1
2
3
4
5
6function runTimer() {
this.time += 10;
console.log(this.time);
setTimeout(runTimer, 10); // 設定下一次執行
}
runTimer();
- 每次執行後再次設定下一次執行,這樣可以更精確地控制執行時間:
動畫框架:
- 使用瀏覽器的
requestAnimationFrame()
來計時並刷新畫面(更適合需要高效的動畫場景)。
- 使用瀏覽器的
7. 總結
setInterval()
在碼錶程式中是不可或缺的,因為它提供了:
- 週期性更新數據的能力。
- 模擬碼錶功能的基礎工具。
- 觸發 Vue 的響應式更新,讓畫面自動同步時間的變化。
如果沒有 setInterval()
,碼錶就無法自動計時,用戶也無法即時看到時間的變化,失去使用碼錶的意義。
requestAnimationFrame() 這是 javascript 的原生函式?
是的,requestAnimationFrame()
是 JavaScript 的原生函式,由瀏覽器提供,用於執行高效的動畫或畫面刷新操作。它是專門設計來取代傳統的 setInterval()
或 setTimeout()
進行動畫更新的,提供了更好的性能和流暢度。
1. requestAnimationFrame()
是什麼?
requestAnimationFrame()
的作用是:
- 告訴瀏覽器:在下一次屏幕重繪之前執行一段指定的函式。
- 瀏覽器會根據屏幕的刷新率(通常是每秒 60 次,等於 16.66 毫秒一次)來調整執行頻率,確保動畫更新的效率和流暢性。
2. 語法
1 | let requestID = requestAnimationFrame(callback); |
參數
callback
: 你想要執行的函式,會在每次屏幕重繪時被調用。
返回值
requestID
: 一個數字標識符,用於取消這次動畫請求(配合cancelAnimationFrame()
)。
3. 簡單範例
以下是一個使用 requestAnimationFrame()
實現簡單動畫的例子:
1 | let start = null; |
解釋:
timestamp
: 由瀏覽器傳入,表示從頁面加載到現在的時間(以毫秒為單位)。- 在
step
函式中,我們計算時間進度progress
,並根據進度執行動畫邏輯。
4. requestAnimationFrame()
的優勢
相比於 setInterval()
或 setTimeout()
,requestAnimationFrame()
的優勢如下:
1. 同步屏幕刷新率
requestAnimationFrame()
自動根據屏幕刷新率調整執行頻率,通常每秒 60 次(約 16.66 毫秒一次),可以保證動畫的流暢性。
2. 節省資源
- 在頁面不可見或不活動時(比如切換到其他標籤頁),瀏覽器會暫停動畫執行,減少不必要的資源消耗。
3. 更精確的時間間隔
requestAnimationFrame()
的執行時機比setInterval()
更準確,因為它直接集成到瀏覽器的重繪機制中。
4. 避免卡頓
- 使用
requestAnimationFrame()
可以減少掉幀的情況,讓動畫更平滑。
5. 在碼錶中使用 requestAnimationFrame()
如果你想用 requestAnimationFrame()
來實現碼錶功能,可以這樣做:
碼錶範例
1 | let start = null; |
對應的 Vue 實現
在 Vue 中,可以這樣整合 requestAnimationFrame()
:
1 | export default { |
6. 總結
requestAnimationFrame()
是 JavaScript 原生的高效動畫工具,適合用於實現:
- 動畫
- 動態數字變化
- 時間計算等
在碼錶中,它可以作為 setInterval()
的替代方案,提供更加流暢和高效的更新機制。