摘要:本文是學(xué)習(xí)定時(shí)器單線程同步異步任務(wù)的筆記,只適合初學(xué)者。第一個(gè)參數(shù)是函數(shù)名或者語句,第二個(gè)參數(shù)延遲的時(shí)間參數(shù),單位為它返回定時(shí)器的編號(hào),以后可以用來取消這個(gè)定時(shí)器。將該整數(shù)傳入和函數(shù),就可以取消對(duì)應(yīng)的定時(shí)器。
本文是學(xué)習(xí)js定時(shí)器、單線程、同步異步任務(wù)的筆記,只適合初學(xué)者。
一、定時(shí)器(timer)JavaScript提供定時(shí)執(zhí)行代碼的功能,該功能主要由setTimeout()和setInterval()這兩個(gè)函數(shù)來實(shí)現(xiàn)
二、setTimeout() 1、使用規(guī)則setTimeout函數(shù)用來指定某個(gè)函數(shù)或某段代碼,在多少毫秒之后執(zhí)行。
第一個(gè)參數(shù)是函數(shù)名或者語句,第二個(gè)參數(shù)延遲的時(shí)間參數(shù),單位為ms
var timerId = setTimeout(function|code, delay) setTimeout("console.log(2)",1000);
它返回定時(shí)器的編號(hào),以后可以用來取消這個(gè)定時(shí)器。
2、使用注意推遲執(zhí)行的代碼必須以字符串的形式,放入setTimeout。
因?yàn)橐鎯?nèi)部使用eval函數(shù),將字符串轉(zhuǎn)為代碼。
如果推遲執(zhí)行的是函數(shù),則可以直接將函數(shù)名,放入setTimeout。
一方面eval函數(shù)有安全顧慮,另一方面為了便于JavaScript引擎優(yōu)化代碼,setTimeout方法一般總是采用函數(shù)名的形式
setInterval函數(shù)的用法與setTimeout完全一致,區(qū)別僅僅在于setInterval指定某個(gè)任務(wù)每隔一段時(shí)間就執(zhí)行一次。如果不取消的話,就會(huì)無限次的定時(shí)執(zhí)行。
第一個(gè)參數(shù)是函數(shù)名或者語句,第二個(gè)參數(shù)是間隔執(zhí)行的時(shí)間,單位為ms
例一:實(shí)現(xiàn)自增數(shù)據(jù)輸出
var i=0 var timer=setInterval(function(){console.log(i++)},1000) //不要在function傳遞i參數(shù),不然得到的就是NaN
例二:實(shí)現(xiàn)定時(shí)器的功能
var timer=setInterval(function(){console.log(new Date)},1000)四、解除定時(shí)器clearTimeout(),clearInterval()
setTimeout和setInterval函數(shù),都返回一個(gè)表示計(jì)數(shù)器編號(hào)的整數(shù)值。
將該整數(shù)傳入clearTimeout和clearInterval函數(shù),就可以取消對(duì)應(yīng)的定時(shí)器。
var id1 = setTimeout(f,1000); var id2 = setInterval(f,1000); clearTimeout(id1); clearInterval(id2);
五:舉個(gè)例子
其實(shí)這篇文章寫定時(shí)器的經(jīng)典案例寫的很棒JavaScrip同步、異步、回調(diào)執(zhí)行順序之經(jīng)典閉包setTimeout分析
var i=0; for(var i=0; i<10; i++){ setTimeout(function(){ console.log(i) }, 1000) }
執(zhí)行結(jié)果:
解析:先執(zhí)行主線程的for循環(huán),for循環(huán)執(zhí)行了10次,把匿名函數(shù)添加了到任務(wù)序列10次。等for循環(huán)執(zhí)行完畢,i變成10之后,把任務(wù)序列的函數(shù)添加到主線程,輸出10次i=10.
var t = true; setTimeout(function(){ t = false; }, 1000); while(t){console.log("end") }
執(zhí)行結(jié)果:不停的輸出end,不會(huì)再1000ms之后停止的。
解析:因?yàn)閣hile循環(huán)是在主線程執(zhí)行,主線程的while的循環(huán)不停止,是不會(huì)再執(zhí)行任務(wù)隊(duì)列里面setimeout的函數(shù)的。
五、六、七章的內(nèi)容全部來源于 阮一峰JavaScript 標(biāo)準(zhǔn)參考教程(alpha)
單線程模型指的是,JavaScript 只在一個(gè)線程上運(yùn)行。也就是說,JavaScript 同時(shí)只能執(zhí)行一個(gè)任務(wù),其他任務(wù)都必須在后面排隊(duì)等待。
注意,JavaScript 只在一個(gè)線程上運(yùn)行,不代表 JavaScript 引擎只有一個(gè)線程。事實(shí)上,JavaScript 引擎有多個(gè)線程,單個(gè)腳本只能在一個(gè)線程上運(yùn)行(稱為主線程),其他線程都是在后臺(tái)配合。
七、同步任務(wù)和異步任務(wù)五、六、七章的內(nèi)容全部來源于 阮一峰JavaScript 標(biāo)準(zhǔn)參考教程(alpha)
程序里面所有的任務(wù),可以分成兩類:同步任務(wù)(synchronous)和異步任務(wù)(asynchronous)。
同步任務(wù)是那些沒有被引擎掛起、在主線程上排隊(duì)執(zhí)行的任務(wù)。只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù)。
異步任務(wù)是那些被引擎放在一邊,不進(jìn)入主線程、而進(jìn)入任務(wù)隊(duì)列的任務(wù)。只有引擎認(rèn)為某個(gè)異步任務(wù)可以執(zhí)行了(比如 Ajax 操作從服務(wù)器得到了結(jié)果),該任務(wù)(采用回調(diào)函數(shù)的形式)才會(huì)進(jìn)入主線程執(zhí)行。
八、任務(wù)隊(duì)列JavaScript 運(yùn)行時(shí),除了一個(gè)正在運(yùn)行的主線程,引擎還提供一個(gè)任務(wù)隊(duì)列(task queue),里面是各種需要當(dāng)前程序處理的異步任務(wù)。
首先,主線程會(huì)去執(zhí)行所有的同步任務(wù)。等到同步任務(wù)全部執(zhí)行完,就會(huì)去看任務(wù)隊(duì)列里面的異步任務(wù)。如果滿足條件,那么異步任務(wù)就重新進(jìn)入主線程開始執(zhí)行,這時(shí)它就變成同步任務(wù)了。等到執(zhí)行完,下一個(gè)異步任務(wù)再進(jìn)入主線程開始執(zhí)行。一旦任務(wù)隊(duì)列清空,程序就結(jié)束執(zhí)行。
引用這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制這篇文章的解析:
同步和異步任務(wù)分別進(jìn)入不同的執(zhí)行"場(chǎng)所",同步的進(jìn)入主線程,異步的進(jìn)入Event Table并注冊(cè)函數(shù)。九、異步與回調(diào)函數(shù)
當(dāng)指定的事情完成時(shí),Event Table會(huì)將這個(gè)函數(shù)移入Event Queue。
主線程內(nèi)的任務(wù)執(zhí)行完畢為空,會(huì)去Event Queue讀取對(duì)應(yīng)的函數(shù),進(jìn)入主線程執(zhí)行。
上述過程會(huì)不斷重復(fù),也就是常說的Event Loop(事件循環(huán))。
來源:如果沒有callback函數(shù),會(huì)先執(zhí)行f2,f3函數(shù)再執(zhí)行f2函數(shù)。
但是如果f1,f2函數(shù)是有先后順序的,必須f1執(zhí)行完成,再執(zhí)行f2的話(f1可能是獲取ajax,f2是處理ajax數(shù)據(jù)),就需要回調(diào)函數(shù)。
給f1設(shè)置callback函數(shù)做參數(shù),然后把這個(gè)參數(shù)當(dāng)成函數(shù)執(zhí)行,執(zhí)行f1的過程中,設(shè)置了一個(gè)定時(shí)器,等數(shù)據(jù)到來之后,再去執(zhí)行callback函數(shù)。然后把f2作為f1的參數(shù)來調(diào)用
function f1(callback){ setTimeout(function(){ //做某件事,可能很久 console.log("別急,開始執(zhí)行f1") for(var i=0;i< 100000;i++){ } console.log("f1執(zhí)行完了") callback() }, 0); } function f2(){ console.log("執(zhí)行f2"); } function f3(){ console.log("執(zhí)行f3"); } f1(f2) //當(dāng)f1執(zhí)行完之后再執(zhí)行 f2 f3()10、函數(shù)節(jié)流
轉(zhuǎn)載一篇函數(shù)節(jié)流與函數(shù)防抖,寫的非常好,具體內(nèi)容可看這篇文章。我不再贅述,我只記錄一下節(jié)流的代碼
var timer function hiFrequency(){ if(timer){ clearTimeout(timer) } timer = setTimeout(function(){ console.log("do something") }, 300) } hiFrequency() hiFrequency() hiFrequency()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99318.html
摘要:異步請(qǐng)求線程在在連接后是通過瀏覽器新開一個(gè)線程請(qǐng)求將檢測(cè)到狀態(tài)變更時(shí),如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件,將這個(gè)回調(diào)再放入事件循環(huán)隊(duì)列中。 基礎(chǔ):瀏覽器 -- 多進(jìn)程,每個(gè)tab頁獨(dú)立一個(gè)瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核) 每個(gè)瀏覽器渲染進(jìn)程是多線程的,主要包括:GUI渲染線程 JS引擎線程 也稱為JS內(nèi)核,負(fù)責(zé)處理Javascript腳本程序。(例如V8引擎) JS引擎線程負(fù)...
摘要:探討判斷橫豎屏的最佳實(shí)現(xiàn)前端掘金在移動(dòng)端,判斷橫豎屏的場(chǎng)景并不少見,比如根據(jù)橫豎屏以不同的樣式來適配,抑或是提醒用戶切換為豎屏以保持良好的用戶體驗(yàn)。 探討判斷橫豎屏的最佳實(shí)現(xiàn) - 前端 - 掘金在移動(dòng)端,判斷橫豎屏的場(chǎng)景并不少見,比如根據(jù)橫豎屏以不同的樣式來適配,抑或是提醒用戶切換為豎屏以保持良好的用戶體驗(yàn)。 判斷橫豎屏的實(shí)現(xiàn)方法多種多樣,本文就此來探討下目前有哪些實(shí)現(xiàn)方法以及其中的優(yōu)...
摘要:搜索引擎中有一個(gè)爬蟲模塊,在頁面中使用諸如等強(qiáng)調(diào)式的標(biāo)簽,有利于,說白了就是有利于被搜索到。定位相對(duì)定位不影響元素本身特性不使元素脫離文檔流。定時(shí)器如果是由事件控制的,要先關(guān)再開,避免多次觸發(fā)而混亂。 CSS篇 注意:css注釋使用/ /,而不是或者//,否則很容易導(dǎo)致不明錯(cuò)誤!!! div padding:內(nèi)邊距。盒子內(nèi)容與盒子邊框的距離設(shè)置,相當(dāng)于給盒子加了厚度,使用此屬性后會(huì)改...
摘要:搜索引擎中有一個(gè)爬蟲模塊,在頁面中使用諸如等強(qiáng)調(diào)式的標(biāo)簽,有利于,說白了就是有利于被搜索到。定位相對(duì)定位不影響元素本身特性不使元素脫離文檔流。定時(shí)器如果是由事件控制的,要先關(guān)再開,避免多次觸發(fā)而混亂。 CSS篇 注意:css注釋使用/ /,而不是或者//,否則很容易導(dǎo)致不明錯(cuò)誤!!! div padding:內(nèi)邊距。盒子內(nèi)容與盒子邊框的距離設(shè)置,相當(dāng)于給盒子加了厚度,使用此屬性后會(huì)改...
摘要:四如果需要遍歷數(shù)組,應(yīng)該先緩存數(shù)組長度,將數(shù)組長度放入局部變量中,避免多次查詢數(shù)組長度。五盡量選用局部變量而不是全局變量。所以如果這樣的表達(dá)式重復(fù)出現(xiàn),只要可能,應(yīng)該盡量少出現(xiàn)這樣的表達(dá)式,可以利用局部變量,把它放入一個(gè)臨時(shí)的地方進(jìn)行查詢。 通過網(wǎng)上查找資料了解關(guān)于性能優(yōu)化方面的內(nèi)容,現(xiàn)簡單整理,僅供大家在優(yōu)化的過程中參考使用,如有什么問題請(qǐng)及時(shí)提出,再做出相應(yīng)的補(bǔ)充修改。 一、 讓...
閱讀 6912·2021-09-22 15:08
閱讀 1920·2021-08-24 10:03
閱讀 2437·2021-08-20 09:36
閱讀 1315·2020-12-03 17:22
閱讀 2474·2019-08-30 15:55
閱讀 905·2019-08-29 16:13
閱讀 3053·2019-08-29 12:41
閱讀 3249·2019-08-26 12:12