亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

setInterval與setTimeout

BenCHou / 499人閱讀

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

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

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

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

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

有一個(gè)大型工廠

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

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

那么:

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

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

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

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

再深入點(diǎn):

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

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

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

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

再再深入:

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

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

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

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

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

/* 一秒鐘后在控制臺(tái)上打印出111 */

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

2.在IE瀏覽器中使用定時(shí)器存在部分小問(wèn)題:

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

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

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

IE8瀏覽器不允許向定時(shí)器中傳遞事件對(duì)象event

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

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

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

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

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

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

如下圖:

4.鏈?zhǔn)絪etTimeout

使用鏈?zhǔn)絪etTimeout來(lái)解決我畫時(shí)鐘的那個(gè)問(wèn)題

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

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

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

往期好文推薦:

畫三角形

webpack打包(有面試題)

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96934.html

相關(guān)文章

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

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

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

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

    meislzhua 評(píng)論0 收藏0
  • setTimeoutsetInterval(一)

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

    Betta 評(píng)論0 收藏0
  • setTimeoutsetInterval

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

    Tangpj 評(píng)論0 收藏0
  • JavaScript 定時(shí)器

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

    王偉廷 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<