2024-11-23 vue 之 if (this.timer) return; 如果沒有這個判斷會怎樣?
2024-11-23 vue 之 if (this.timer) return; 如果沒有這個判斷會怎樣?
這句話的目的是防止計時器重複啟動。如果沒有這個判斷,可能會導致多個計時器同時運行,導致時間計算出錯。
程式碼中的邏輯
1 | if (this.timer) return; // 防止重複啟動 |
- **
this.timer
**:是一個計時器 ID,用來追蹤計時器是否已經啟動。如果this.timer
不為null
,代表計時器正在運行。 - **
return
**:中止執行後續程式碼,防止重複啟動。
沒有這段代碼的情況
假設有以下程式碼:
1 | startTimer() { |
如果按下多次「啟動」按鈕,會發生什麼?
- 每按一次「啟動」,都會新建一個計時器(
setInterval
)。 - 這些計時器會同時運行,導致時間以更快的速度累加。
實際範例
假設我們連續按了 3 次「啟動」:
- 第一次按下:時間每 10 毫秒增加 10。
- 第二次按下:時間每 10 毫秒增加 20(兩個計時器在運行)。
- 第三次按下:時間每 10 毫秒增加 30(三個計時器在運行)。
假設過了 1 秒鐘:
- 正確情況(只有一個計時器):
time = 1000
(1 秒 = 1000 毫秒)。 - 沒有防重啟的情況(三個計時器同時運行):
- 第 1 個計時器:
time = 1000
- 第 2 個計時器:
time = 1000
- 第 3 個計時器:
time = 1000
- 總計:
time = 3000
- 第 1 個計時器:
有防重啟的效果
加入 if (this.timer) return
後:
- 當第一次按下「啟動」時:
this.timer
為null
,計時器啟動。
- 當第二次按下「啟動」時:
this.timer
已有值,表示計時器正在運行,程式碼會直接return
,不再啟動新的計時器。
正確情況
- 無論按下多少次「啟動」,都只有一個計時器運行。
完整範例
1 | startTimer() { |
測試結果
按「啟動」後每秒輸出的值:
沒有防重啟:
1
2
310, 20, 30, 40... (第一個計時器)
20, 40, 60, 80... (第二個計時器)
30, 60, 90, 120... (第三個計時器)有防重啟:
1
10, 20, 30, 40, 50... (正確情況)
總結
if (this.timer) return
是為了防止多次啟動計時器,保證程式邏輯的正確性。- 沒有這句判斷會導致多個計時器同時運行,時間累加錯誤。