摘要:也就是說,代碼隊列中僅能有一個間歇定時器在等待。這導致兩個問題,一是某些間隔會跳過,二是多個定時器的代碼之間的間隔可能比預期的小。
定時器:間歇調用和超時調用
超時調用:setTimeout(),接受兩個參數(shù),第一個參數(shù)是可執(zhí)行的JavaScript代碼字符串,或是回調函數(shù),第二個參數(shù)是毫秒為單位的插入代碼隊列的的時間。
清除方式:clearTimeout(),參數(shù)是設置setTimeout時返回的數(shù)值ID。
var timeId = setTimeout(function(){ alert("hello world"); }, 5000); clearTimeout(timeId);
間歇調用:setInterval(),接受的兩個參數(shù)和setTimeout()類似,只是時間參數(shù)代表兩次間隔插入代碼隊列的的時間。
清除方式:clearInterval(),參數(shù)是設置間歇調用時返回的數(shù)值ID。清除間歇調用很重要,因為不清除就會一直執(zhí)行,也就是一直在JavaScript的時間線中。因為JavaScript是單線程執(zhí)行的,也就是說如果不清除間歇調用,代碼隊列中的其他的代碼即使進入了代碼也是無法執(zhí)行的。事實上,間歇調用導致的問題不止如此。
var timeId = setInterval(function(){ alert("hello world"); }, 5000); clearInterval(timeId);
一般沒有必要跟蹤超時調用的ID,因為執(zhí)行一次之后就自動清除了;但是間歇調用最好人工清除,或者采用超時調用模擬間歇調用,這還有另外一個好處。
JavaScript的時間線及間歇調用的困擾JavaScript是單線程執(zhí)行的,不同時期由不同的代碼控制JavaScript時間線,由瀏覽器從代碼隊列中選擇特定的代碼執(zhí)行。定時器中設置的時間實際上是指定時器代碼進入代碼隊列的時間,實際開始運行時間取決于JavaScript進程是否空閑,如果不空閑就要等待正在執(zhí)行的代碼完成執(zhí)行。
var btn = document.getElementById(“my-btn”); btn.onclick = function(){ setTimeout(function(){ document.getElementById(“message”).style.visibility = “visible”; }, 250); };
上圖設置了一個250ms后的timer,但是由于onclick事件處理程序要執(zhí)行300ms,即使到了255ms,timer也是不執(zhí)行的,直到onclick執(zhí)行完才能執(zhí)行。
JavaScript的這種單線程執(zhí)行方式導致了瀏覽器添加間歇定時器代碼時,僅能等待隊列中沒有該定時器的代碼實例時才能加進去,否則加不進去。也就是說,代碼隊列中僅能有一個間歇定時器在等待。這導致兩個問題,一是某些間隔會跳過,二是多個定時器的代碼之間的間隔可能比預期的小。
上圖表明,205ms加入的定時器在300ms開始執(zhí)行,由于定時器執(zhí)行時間超過一個時間間隔(200ms),在405ms第二個定時器進入隊列,但是605ms時的代碼卻難以進入隊列了,這是因為405ms進入的代碼還在隊列中。
為了避免重復定時器的缺點,常使用超時定時器模擬間歇定時器,如下:
setTimeout(function(){ //processing setTimeout(arguments.callee, interval); }, interval); 具體的使用實例如下:定時器的使用:數(shù)組分塊(array chunking)和函數(shù)節(jié)流(function throttling)the onlt one div
數(shù)組分塊的原因:JavaScript的功能是被限制的,無法像桌面應用一樣無限制的占有資源。其中一個限制就是執(zhí)行時間的限制,如果代碼執(zhí)行超過特定的時間或者特定的語句數(shù)目就禁止繼續(xù)執(zhí)行。因此,在處理大規(guī)模數(shù)組時,可以使用定時器將數(shù)組分為多個塊間斷執(zhí)行,JavaScript進程有時間在處理數(shù)組項目的事件之間轉入空閑,這樣整個數(shù)組項目項目的處理就不會受執(zhí)行時間限制。實現(xiàn)數(shù)組分組的函數(shù)如下:
the onlt one div
函數(shù)節(jié)流的原因:瀏覽器中某些計算很耗費資源,包括CPU和內存,例如resize操作,因此如果循環(huán)執(zhí)行這些操作會使瀏覽器崩潰。函數(shù)節(jié)流的原理類似于數(shù)組分塊,也就是某一個執(zhí)行代碼用定時器分位數(shù)塊執(zhí)行。不詳細介紹。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/50142.html
摘要:也就是說,代碼隊列中僅能有一個間歇定時器在等待。這導致兩個問題,一是某些間隔會跳過,二是多個定時器的代碼之間的間隔可能比預期的小。 定時器:間歇調用和超時調用 超時調用:setTimeout(),接受兩個參數(shù),第一個參數(shù)是可執(zhí)行的JavaScript代碼字符串,或是回調函數(shù),第二個參數(shù)是毫秒為單位的插入代碼隊列的的時間。清除方式:clearTimeout(),參數(shù)是設置setTimeo...
摘要:如果構造函數(shù)竊取結合使用原型鏈或者寄生組合則可以解決這個問題惰性載入函數(shù)惰性載入表示函數(shù)執(zhí)行的分支僅會發(fā)生一次。當?shù)诙握{用該函數(shù)時,它會清除前一次的定時器并設置另一個。,用于注銷某個事件類型的事件處理程序。 高級技巧 高級函數(shù) 安全的類型檢測 typeof操作符在檢測數(shù)據(jù)類型時,可能會得到不靠譜的結果 instanceof操作符在存在多個全局作用域,也就是頁面包含多個iframe的...
摘要:解決方式是,當我們不使用它們的時候,手動切斷鏈接淘汰把和對象轉為了真正的對象,避免了使用這種垃圾收集策略,消除了以下常見的內存泄漏的主要原因。以上參考資料高程垃圾收集類內存泄漏及如何避免內存泄露及解決方案詳解類內存泄漏及如何避免 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1ft1ikzcqzqj30ka0et77a.jpg); 前言 起...
摘要:圖二解讀定時器可以在指定時間把定時器代碼加入待執(zhí)行隊列,但并不能保證代碼執(zhí)行時機,待執(zhí)行隊列中的代碼要等進程空閑時才能執(zhí)行。也就是說定時器每隔間隔觸發(fā)一次,嘗試加入隊列,擁堵時段將直接忽略本次操作。 圖片出自JS高程(第三版) showImg(https://segmentfault.com/img/bVbgC3V?w=1337&h=313); 圖一解讀:JS運行于單線程的環(huán)境中:頁面...
摘要:封裝方法也比較簡單,書中對此問題也進行了處理使用定時器,讓函數(shù)延遲秒后執(zhí)行,在此秒內,然后函數(shù)再次被調用,則刪除上次的定時器,取消上次調用的隊列任務,重新設置定時器。 在實際開發(fā)中,函數(shù)一定是最實用最頻繁的一部分,無論是以函數(shù)為核心的函數(shù)式編程,還是更多人選擇的面向對象式的編程,都會有函數(shù)的身影,所以對函數(shù)進行深入的研究是非常有必要的。 函數(shù)節(jié)流 比較直白的說,函數(shù)節(jié)流就是強制規(guī)定一...
閱讀 2655·2021-11-23 09:51
閱讀 1644·2021-11-22 13:54
閱讀 2782·2021-11-18 10:02
閱讀 936·2021-08-16 10:57
閱讀 3554·2021-08-03 14:03
閱讀 1873·2019-08-30 15:54
閱讀 3527·2019-08-23 14:39
閱讀 598·2019-08-23 14:26