JavaScript兩大定時器


0.前言

有一段時間沒有寫博客了,不過令我高興地是寫了這么長時間的文章,終于收到了關注和評價,在首頁上通過了文章,非常高興,也很興奮!!好了言歸正傳,我來分享一下今天主要的知識點:間歇性定時器延時定時器。學完這個,我們可以寫一些時鐘、秒表、進度條等有趣控件。

1.間歇性定時器——setInterval

格式:setInterval(參數1,參數2);
參數:參數1表示函數名,參數2表示設置的時間(毫秒);
功能:每間隔參數2時間,調用一次參數1函數;
返回值:定時器的id,可單位是毫秒以通過這個id關閉定時器

(1)創建定時器

var timer = setInterval(func,1000);
用一個變量保存定時器,注意,用setInterval創建定時器即啟動,同時返回該定時的id。

(2)關閉定時器

既然創建了定時器,那么如何關閉定時器呢?
通過返回得到定時器的id,從而關閉定時器。用clearInterval方法。
clearInterval(timer);
其中的“timer”表示的是上面常見定時器器是所用的變量。
注意:JS中沒有暫停一說,關閉就銷毀了。如果需要繼續運行,則需重新創建定時器。

2.延時定時器——setTimeout

格式:setTimeout(參數1,參數2);
參數:參數1表示的是函數名,參數2表示設置的時間(毫秒);
功能:參數2時間后調用參數1函數;
返回值:返回定時器的id,可以通過該id關閉定時器

(1)創建定時器

var timer = setTimeout(func,1000);

(2)關閉定時器

clearTimeout(timer);


3.兩者比較

用setInterval創建定時器是載入界面后,每間隔參數2個時間,執行一次參數1函數,是連續執行的;而setTimeout創建的定時器是先執行參數2,然后再執行參數1,記住只執行一次參數1,不是連續的。

4.案例

說了這么多,可能感覺到非常暈,下面我來用例子說明上面的問題。
(1)setInterval
首先我們打個界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>定時器-間歇性定時器</title>
</head>
<body>
    <button onclick="consoleInterval()">關閉定時器(暫停)</button>
    <button onclick="goOn()">繼續</button>
</body>
</html>

運行結果如下:

捕獲.PNG

然后編寫函數,在body標簽里面添加如下代碼:

<script type="text/javascript">
        var timer = window.setInterval(func,1000);
        function func() {
            console.log("hello world!!!");
        }

        function consoleInterval() {
            window.clearInterval(timer);
        }
        function goOn() {
            timer = window.setInterval(func,1000);
        }
    </script>

此時在控制臺上的結果為:

捕獲.PNG

出現的bug
??當我們連續點擊“繼續”按鈕發現打印的速度變得非常快,而且再點擊關閉定時器會發下,管不了,這是為什么呢?
因為,當我們連續點擊繼續按鈕時,相當于創建了多個定時器,再點關閉按鈕,他只能關閉當前最后一次點擊時出現的定時器,前面創建的的定時器是關閉不了的,所以會出現上述情況。
解決辦法:用一個變量來判斷定時器是存在的還會被注銷了。
修改js代碼如下:

<script type="text/javascript">
        var timer = window.setInterval(func,1000);
        var flag = true;

        function func() {
            console.log("hello world!!!");
        }

        function consoleInterval() {
            window.clearInterval(timer);
            flag = false;
        }
        function goOn() {

            if(flag){
                return;
            }
            timer = window.setInterval(func,1000);
            flag = true;
        }
    </script>

詳解:
??在一開始創建定時器時,將flag設置為true,表示當前存在定時器。當點擊“關閉”按鈕時,相當于銷毀了定時器,此時將flag設置為false,表示沒有定時器的存在;當調用“繼續”按鈕時,首先要判斷flag,如果flag為true,表示當前有定時器,不需要創建了,不會再執行后面的代碼,若果flag為false,表示沒有定時器,就可以創建定時器,從而有效的避免上述出現的問題。


5.總結

終于說完了,累死我了,關于這兩個定時器,我知道的也就這么多了,謝謝打賞!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • 前言:在引用開發中,我們經常需要在頁面中執行一些周期性的操作,比如每隔一段時間就執行某一固定的操作。而對于這樣的操...
    帥帥噠小白閱讀 5,358評論 1 3
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,396評論 0 6
  • 時光沒有長度 但是可以有厚度 不主動活的有厚度 就只有反思自己的理念 是否有無毒 虛度光陰沒有錯 錯在不反思為何虛度
    10086好閱讀 269評論 0 0
  • 面對你的文字,我不知該如何描述, 有時淺薄的語言讓你難受, 有時深切的話語又讓你深思。 你或許在求得記下生活點滴中...
    _山枕檀痕涴_閱讀 139評論 0 0