<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Js中setTimeout()和setInterval()何時被調用執行的用法_基礎知識

        來源:懂視網 責編:小采 時間:2020-11-27 21:08:30
        文檔

        Js中setTimeout()和setInterval()何時被調用執行的用法_基礎知識

        Js中setTimeout()和setInterval()何時被調用執行的用法_基礎知識:定義setTimeout()和setInterval()經常被用來處理延時和定時任務。setTimeout() 方法用于在指定的毫秒數后調用函數或計算表達式,而setInterval()則可以在每隔指定的毫秒數循環調用函數或表達式,直到clearInterval把它清除。從定義上我們可以看到兩
        推薦度:
        導讀Js中setTimeout()和setInterval()何時被調用執行的用法_基礎知識:定義setTimeout()和setInterval()經常被用來處理延時和定時任務。setTimeout() 方法用于在指定的毫秒數后調用函數或計算表達式,而setInterval()則可以在每隔指定的毫秒數循環調用函數或表達式,直到clearInterval把它清除。從定義上我們可以看到兩

        定義
        setTimeout()和setInterval()經常被用來處理延時和定時任務。setTimeout() 方法用于在指定的毫秒數后調用函數或計算表達式,而setInterval()則可以在每隔指定的毫秒數循環調用函數或表達式,直到clearInterval把它清除。
        從定義上我們可以看到兩個函數十分類似,只不過前者執行一次,而后者可以執行多次,兩個函數的參數也相同,第一個參數是要執行的code或句柄,第二個是延遲的毫秒數。
        很簡單的定義,使用起來也很簡單,但有時候我們的代碼并不是按照我們的想象精確時間被調用的,很讓人困惑


        簡單示例
        看個簡單的例子,簡單頁面在加載完兩秒后,寫下Delayed alert!
        代碼如下:
        setTimeout('document.write("Delayed alert!");', 2000);

        看起來很合理,我們再看個setInterVal()方法的例子
        代碼如下:
        var num = 0;
        var i = setInterval(function() {
        num++;
        var date = new Date();
        document.write(date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds() + '
        ');
        if (num > 10)
        clearInterval(i);
        }, 1000);

        頁面每隔1秒記錄一次當前時間(分鐘:秒:毫秒),記錄十次后清除,不再記錄。考慮到代碼執行時間可能記錄的不是執行時間,但時間間隔應該是一樣的,看看結果
        代碼如下:
        :38:116
        :39:130
        :40:144
        :41:158
        :42:172
        :43:186
        :44:200
        :45:214
        :46:228
        :47:242
        :48:256

        為什么
        時間間隔幾乎是1000毫秒,但不精確,這是為什么呢?原因在于我們對JavaScript定時器存在一個誤解,JavaScript其實是運行在單線程的環境中的,這就意味著定時器僅僅是計劃代碼在未來的某個時間執行,而具體執行時機是不能保證的,因為頁面的生命周期中,不同時間可能有其他代碼在控制JavaScript進程。在頁面下載完成后代碼的運行、事件處理程序、Ajax回調函數都是使用同樣的線程,實際上瀏覽器負責進行排序,指派某段程序在某個時間點運行的優先級。
        我們把效果放大一下看看,添加一個耗時的任務
        代碼如下:
        function test() {
        for (var i = 0; i < 500000; i++) {
        var div = document.createElement('div');
        div.setAttribute('id', 'testDiv');
        document.body.appendChild(div);
        document.body.removeChild(div);
        }
        }
        setInterval(test, 10);
        var num = 0;
        var i = setInterval(function() {
        num++;
        var date = new Date();
        document.write(date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds() + '
        ');
        if (num > 10)
        clearInterval(i);
        }, 1000);

        我們又加入了一個定時任務,看看結果
        代碼如下:
        :9:222
        :12:482
        :16:8
        :19:143
        :22:631
        :25:888
        :28:712
        :32:381
        :34:146
        :35:565
        :37:406

        這下效果明顯了,差距甚至都超過了3秒,而且差距很不一致。
        我們可以可以把JavaScript想象成在時間線上運行。當頁面載入的時候首先執行的是頁面生命周期后面要用的方法和變量聲明和數據處理,在這之后JavaScript進程將等待更多代碼執行。當進程空閑的時候,下一段代碼會被觸發

        除了主JavaScript進程外,還需要一個在進程下一次空閑時執行的代碼隊列。隨著頁面生命周期推移,代碼會按照執行順序添加入隊列,例如當按鈕被按下的時候他的事件處理程序會被添加到隊列中,并在下一個可能時間內執行。在接到某個Ajax響應時,回調函數的代碼會被添加到隊列。JavaScript中沒有任何代碼是立即執行的,但一旦進程空閑則盡快執行。定時器對隊列的工作方式是當特定時間過去后將代碼插入,這并不意味著它會馬上執行,只能表示它盡快執行。
        知道了這些后,我們就能明白,如果想要精確的時間控制,是不能依賴于JavaScript的setTimeout函數的。

        重復的定時器
        使用 setInterval() 創建的定時器可以使代碼循環執行,到有指定效果的時候,清除interval就可以,如下例
        代碼如下:
        var my_interval = setInterval(function () {
        if (condition) {
        //..........
        } else {
        clearInterval(my_interval);
        }
        }, 100);

        但這個方式的問題在于定時器的代碼可能在代碼再次被添加到隊列之前還沒有執行完成,結果導致循環內的判斷條件不準確,代碼多執行幾次,之間沒有停頓。不過JavaScript已經解決這個問題,當使用setInterval()時,僅當沒有該定時器的其他代碼實例時才將定時器代碼插入隊列。這樣確保了定時器代碼加入到隊列的最小時間間隔為指定間隔。

        這樣的規則帶來兩個問題

        1.1. 某些間隔會被跳過
        2.2.多個定時器的代碼執行之間的間隔可能比預期要小
        為了避免這兩個缺點,我們可以使用setTimeout()來實現重復的定時器
        代碼如下:
        setTimeout(function () {
        //code
        setTimeout(arguments.callee, interval);
        }, interval)

        這樣每次函數執行的時候都會創建一個新的定時器,第二個setTimeout()調用使用了agrument.callee 來獲取當前實行函數的引用,并設置另外一個新定時器。這樣做可以保證在代碼執行完成前不會有新的定時器插入,并且下一次定時器代碼執行之前至少要間隔指定時間,避免連續運行。
        代碼如下:
        setTimeout(function () {
        var div = document.getElementById('moveDiv');
        var left = parseInt(div.style.left) + 5;
        div.style.left = left + 'px';
        if (left < 200) {
        setTimeout(arguments.callee, 50);
        }
        }, 50);

        這段定時器代碼每次執行的時候,把一個div向右移動5px,當坐標大于200的時候停止。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Js中setTimeout()和setInterval()何時被調用執行的用法_基礎知識

        Js中setTimeout()和setInterval()何時被調用執行的用法_基礎知識:定義setTimeout()和setInterval()經常被用來處理延時和定時任務。setTimeout() 方法用于在指定的毫秒數后調用函數或計算表達式,而setInterval()則可以在每隔指定的毫秒數循環調用函數或表達式,直到clearInterval把它清除。從定義上我們可以看到兩
        推薦度:
        標簽: js 調用 的用法
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲精品偷拍视频免费观看| 亚洲精品无码午夜福利中文字幕| 老司机亚洲精品影院无码| 中文字幕乱码系列免费| 免费在线视频你懂的| 亚洲av不卡一区二区三区| 大地资源中文在线观看免费版| 亚洲最大激情中文字幕| 亚洲AV成人无码天堂| 波多野结衣在线免费观看| 亚洲国产综合无码一区二区二三区| 婷婷国产偷v国产偷v亚洲| 四虎永久在线精品视频免费观看| 亚洲AV无码成人精品区日韩| 国产一区二区三区免费视频| 男人j进女人p免费视频| 亚洲欧洲∨国产一区二区三区| 亚洲成在人线在线播放无码| 国产99视频免费精品是看6| 免费视频精品一区二区| 亚洲熟妇中文字幕五十中出| 国产在线精品免费aaa片| 亚洲最大中文字幕| 午夜a级成人免费毛片| 亚洲自偷精品视频自拍| 中文字幕不卡免费视频| 亚洲毛片在线观看| 国产永久免费高清在线| 亚洲图片中文字幕| 日韩精品电影一区亚洲| 国产精品亚洲а∨天堂2021 | 免费一级毛片在线播放放视频| 亚洲精品无码久久毛片| 91精品啪在线观看国产线免费| 亚洲w码欧洲s码免费| 亚洲成片观看四虎永久| 久久国产精品免费看| 亚洲第一成年网站视频| 亚洲伊人久久精品影院| 成人免费毛片内射美女APP| 激情五月亚洲色图|