国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

setInterval與setTimeout

BenCHou / 447人閱讀

摘要:第二個調(diào)用當(dāng)前執(zhí)行的函數(shù),并為其設(shè)置另外一個定時器。使得在前一個定時器代碼執(zhí)行完之前,不會向隊(duì)列插入新的定時器代碼,確保不會有任何缺失的間隔。

在自己用canvas畫一個時鐘時,畫秒鐘用的是利用圖片將重復(fù)的線條遮住,但是會出現(xiàn)有兩個秒鐘線條同時存在,才想起setInterval有那么個坑,查了點(diǎn)資料,記錄下,若有不對的或者未寫到的點(diǎn),還請大家指出,謝謝^_^

在此之前先科普下這個學(xué)習(xí)點(diǎn)

進(jìn)程與線程的區(qū)別

借用阮一峰大大借用的比喻,實(shí)現(xiàn)一個小實(shí)例:

有一個大型工廠

工廠里有若干車間,每次只能有一個車間在作業(yè)

每個車間里有若干房間,有若干工人在流水線作業(yè)

那么:

一個工廠對應(yīng)的就是計算機(jī)的一個CPU,平時講的多核就代表多個工廠

每個工廠里的車間,就是進(jìn)程,意味著同一時刻一個CPU只運(yùn)行一個進(jìn)程,其余進(jìn)程在怠工

這個運(yùn)行的車間(進(jìn)程)里的工人,就是線程,可以有多個工人(線程)協(xié)同完成一個任務(wù)

車間(進(jìn)程)里的房間,代表內(nèi)存。

再深入點(diǎn):

車間(進(jìn)程)里工人可以隨意在多個房間(內(nèi)存)之間走動,意味著一個進(jìn)程里,多個線程可以共享內(nèi)存

部分房間(內(nèi)存)有限,只允許一個工人(線程)使用,此時其他工人(線程)要等待

房間里有工人進(jìn)去后上鎖,其他工人需要等房間(內(nèi)存)里的工人(線程)開鎖出來后,才能才進(jìn)去,這就是互斥鎖(Mutual exclusion,縮寫 Mutex)

有些房間只能容納部分的人,意味著部分內(nèi)存只能給有限的線程

再再深入:

如果同時有多個車間作業(yè),就是多進(jìn)程

如果一個車間里有多個工人協(xié)同作業(yè),就是多線程

當(dāng)然不同車間之間的工人也可以有相互協(xié)作,就需要協(xié)調(diào)機(jī)制

感覺一下子就記住了這兩者的概念及區(qū)別
1.setTimeout

setTimeout()用來指定某個函數(shù)或字符串在指定的毫秒數(shù)之后執(zhí)行;它會返回一個整數(shù),表示定時器的編號,這個值可以傳遞給clearTimeout()用來清除定時器

/* 一秒鐘后在控制臺上打印出111 */

也可以寫成字符串參數(shù)的形式,但這種形式會造成javascript引擎兩次解析,降低性能(1.引擎內(nèi)部使用eval()函數(shù),將字符串轉(zhuǎn)為代碼;2.代碼執(zhí)行的解析)

2.在IE瀏覽器中使用定時器存在部分小問題:

IE9瀏覽器只允許setTimeout有兩個參數(shù),不支持更多的參數(shù),會在控制臺輸出NaN

可以使用IIFE來進(jìn)行參數(shù)的傳遞

setTimeout((function(x, y) {
    console.log(x+y);
})(1,2), 1000)

IE8瀏覽器不允許向定時器中傳遞事件對象event

可以將事件對象中的某些屬性保存在變量中傳遞進(jìn)去

div.onclick = function(e) {
    e = e || event;
    let type = e.type;
    setTimeout(function(e) {
        console.log(e.type);  /* 報錯 */
        console.log(type);  /* click */
    }, 1000)
}
3.setInterval

setInterval指定某個任務(wù)每隔一段時間就執(zhí)行一次,也就是無限次的定時執(zhí)行

HTML5標(biāo)準(zhǔn)規(guī)定,setTimeout的最短時間間隔是4ms;setInterval的最短間隔時間是10ms,所以,小于了最短的時間間隔會被調(diào)整到最短時間間隔

使用setInterval()時,定時器代碼可能在代碼再次被添加到隊(duì)列之前還沒有完成執(zhí)行,導(dǎo)致定時器代碼連續(xù)執(zhí)行了多次,但之間沒有任何停頓。javascript引擎的解決方式就是:使用setInterval()時,僅當(dāng)沒有該定時器的任何其他代碼實(shí)例時,才將定時器代碼添加到執(zhí)行隊(duì)列中,確保定時器代碼加入到隊(duì)列中的最小時間間隔為指定間隔

但這也會導(dǎo)致兩個問題:1.某些間隔被跳過2.多個定時器的代碼執(zhí)行之間的間隔可能比預(yù)期的小

如下圖:

4.鏈?zhǔn)絪etTimeout

使用鏈?zhǔn)絪etTimeout來解決我畫時鐘的那個問題

setTimeout(function fn() {
    console.log(111);
    setTimeout(fn, 1000);
}, 1000)

使用鏈?zhǔn)侥J秸{(diào)用setTimeout(),函數(shù)執(zhí)行的時候都會創(chuàng)建一個新的定時器。第二個setTimeout()調(diào)用當(dāng)前執(zhí)行的函數(shù),并為其設(shè)置另外一個定時器。使得在前一個定時器代碼執(zhí)行完之前,不會向隊(duì)列插入新的定時器代碼,確保不會有任何缺失的間隔。而且,它可以保證在下一次定時器代碼執(zhí)行之前,至少要等待指定的間隔,避免了連續(xù)的運(yùn)行

正在努力學(xué)習(xí)中,若對你的學(xué)習(xí)有幫助,留下你的印記唄(點(diǎn)個贊咯^_^)

往期好文推薦:

畫三角形

webpack打包(有面試題)

時間戳轉(zhuǎn)換成時間日期格式及去重

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/96934.html

相關(guān)文章

  • process.nextTick() 、setTimeout()、setInterval() 運(yùn)行機(jī)

    摘要:注意如果主邏輯的代碼執(zhí)行時間已經(jīng)超過了第二個參數(shù)設(shè)置的時間,那么等運(yùn)行到該回調(diào)函數(shù)時,它會忽略掉這個時間,并立即執(zhí)行。如果某一個進(jìn)行大量的計算,那么它就會阻塞在當(dāng)前的回調(diào)函數(shù)中,等待該計算完成后,再執(zhí)行下一個的回調(diào)函數(shù)。 setTimeout() ? JavaScript是一個單線程的語言,也就是說它同一時間只能執(zhí)行一段代碼,接下來我們通過兩個例子說明一下單線程語言和多線程語言的...

    lscho 評論0 收藏0
  • setTimeoutsetInterval的區(qū)別和nodejs中的差異

    摘要:關(guān)于定時器的源碼在文件中,進(jìn)入就關(guān)于定時器的一些設(shè)計解釋,因?yàn)槭亲龇?wù)端代碼,在內(nèi)部等大部分事件都會創(chuàng)建一個定時器,任何時間都可能存在大量的定時器任務(wù),所以設(shè)計一個高效的定時器是很有必要的。 博客文章地址 setTimeout與setInterval setTimeout 和 setInterval 是我們在 javaScript 中經(jīng)常用到的定時器,setTimeout 方法用于...

    meislzhua 評論0 收藏0
  • setTimeoutsetInterval(一)

    摘要:看一下例子一些其他的代碼假定處理程序需要執(zhí)行,這時雖然在添加了定時器代碼,但是仍舊需要等待事件完成后才能夠執(zhí)行。缺點(diǎn)某些間隔會被跳過多個定時器的代碼執(zhí)行之間的間隔可能會比預(yù)期小。 一. setTimeout 1. 定義 window.setTimeout(func,[delay,param1,param2,····]); window.setTimeout(code,[delay]);...

    Betta 評論0 收藏0
  • setTimeoutsetInterval

    摘要:工作線程執(zhí)行異步任務(wù),執(zhí)行完成后把對應(yīng)額回調(diào)函數(shù)封裝成一條消息放到消息隊(duì)列中主線程不斷地從消息隊(duì)列中取消息并執(zhí)行。當(dāng)消息隊(duì)列為空時,主線程阻塞,直到消息隊(duì)列再次非空。取決于何時被主線程的事件循環(huán)取到,并執(zhí)行。 轉(zhuǎn)自:http://palmer.arkstack.cn/201...一:平時簡單使用 1.setTimeout延遲一段時間執(zhí)行一次(only one) setTimeout(f...

    Tangpj 評論0 收藏0
  • JavaScript 定時器

    摘要:定時器方法相關(guān)方法有四種。返回值返回值是一個正整數(shù),表示定時器的編號。這個值可以傳遞給來取消該定時器。使用方法很簡單只有一個參數(shù),該參數(shù)為您要取消定時器的標(biāo)識符。用法很簡單當(dāng)代碼運(yùn)行到這行的時候,會取消所設(shè)置的定時器。 簡單介紹在JavaScript中定時器有兩個 setInterval() 與 setTime...

    王偉廷 評論0 收藏0

發(fā)表評論

0條評論

BenCHou

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<