一、概述
JavaScript是一門弱類型的腳本語言,在處理非同步編程時非常容易出現問題。setTimeout函數是一種常用的非同步編程方法,它會在指定延遲時間後,調用一個函數。除了setTimeout函數,JavaScript還提供了另一個函數叫做clearTimeout。
二、什麼是clearTimeout?
clearTimeout是一個用來取消setTimeout函數執行操作的方法。setTimeout函數返回一個標識符,這個標識符可以被用於取消已經排定的延遲函數執行。clearTimeout函數會在定時器開始執行前,清除掉這個標識符。如果clearTimeout函數在延遲函數執行以後被調用,那麼這個清除操作將不會生效。
三、clearTimeout的應用
除了cancel掉setTimeout函數已經延遲執行的回調函數外,clearTimeout還經常被用來優化代碼執行,避免重複性代碼的執行以及性能的浪費。在非同步編程中,判斷某個操作是否完成依賴於某個標識符,此時應該用setTimeout函數持有這個標識符,並設置一個延遲時間。當這個時間段過後,setTimeout函數內的函數會執行,並且按照順序執行。如果這個標識符在這個函數體內還存在,那麼判斷標識符的操作將會執行。否則,說明操作已完成,setTimeout函數內的函數就會直接在函數體內調用回調函數,從而達到優化代碼的目的。
四、學習清除計時器的四種方式
1. 方式一:直接使用 clearTimeout 根據 timer ID 清除 setTimeout 計時器。
var myVar = setTimeout(function(){ alert("Timer expired"); }, 3000);
// 取消 setTimeout 計時器
clearTimeout(myVar);
上述代碼創建並執行一個延遲3秒後執行的函數,然後在第二行使用 clearTimeout 取消該定時器。
2. 方式二:多個計時器的集中管理
var timerCollection = [];
function killAllTimers() {
for (var i = 0; i < timerCollection.length; i++) {
clearTimeout(timerCollection[i]);
}
}
這種方式可以在多個計時器的情況下集中清除,而不必單獨寫每個計時器的 clearTimeout,代碼復用性較好。
3. 方式三:非常確保傳入 clearTimeout 的函數正確啟動了定時的狀態
var timerId = setTimeout(function(){
console.log("hello, world!");
}, 2000);
// 現在取消
if (timerId) {
clearTimeout(timerId);
}
有時候,調用 clearTimeout 方法,參數 timer ID 是 undefined 或者 0 是無效的,因為這些值不能正確表示定時器的狀態,所以這時候還需要針對性的進行代碼更改。
4. 方式四:當遇到 clearTimeout 連續重複調用時需要考慮多次重複調用的解決方案
// 定義全局變數
var timerId = null;
function doSomething() {
// 如果 timer 已經在土豆了就不要再調用了
if (timerId) return;
timerId = setTimeout(function() {
// 記得重置該超時狀態
timerId = null;
console.log("重複的調用了");
}, 1000);
}
因為 clearTimeout 工作方式的原因,它無法保證獲得到的定時器 ID 處於啟動狀態或未啟動狀態。 所以,如果您的代碼需要在多處地方訪問定時器ID,並嘗試取消該定時器,請始終使用形如上述樣式的代碼。
五、總結
clearTimeout函數是JavaScript非同步編程中的一個非常重要的函數,它可以取消setTimeout函數的執行,同時也可以優化代碼的執行效率,避免重複代碼執行造成的性能浪費。通過對clearTimeout函數的掌握,可以更加深入了解JavaScript非同步編程方法,同時也能夠更好地編寫高效的代碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283229.html