JavaScript函數(shù)節(jié)流的兩種寫法
最近看了函數(shù)節(jié)流的相關(guān)內(nèi)容,具體什么是節(jié)流我不討論了,網(wǎng)上很多,這里總結(jié)下兩個(gè)方法,我只認(rèn)可其中一個(gè)。另一個(gè)貌似也能達(dá)到節(jié)流的效果但是感覺不是很正規(guī)。
方法一:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>函數(shù)節(jié)流</title> <style> div{ font-size:40px; color:red; text-align: center; } </style> </head> <body> <div>0</div> <script> var a=0; var oDiv=document.getElementsByTagName('div')[0]; var throttle=function(fn,wait){ var startTime=new Date(); return function(){ var arg=arguments; var context=this; var curTime=new Date(); // 如果達(dá)到了規(guī)定的觸發(fā)時(shí)間間隔,觸發(fā) handler var remaing=wait-(curTime-startTime) if(remaing<=0||remaing>wait){//按理說remaing足夠證明已經(jīng)到了時(shí)間間隔,但是為了防止客戶端修改了時(shí)間所以加個(gè)條件(為什么這么加我也不懂) fn.apply(context,arg); startTime=curTime; } }; }; window.onmousemove=throttle(function(){ a++; oDiv.innerText=a+""; },2000); </script> </body> </html>
我比較認(rèn)可這個(gè)方法,另外這是簡潔版,還有一種可以是這樣子的
function throttle(fun, delay, time) { var timeout, startTime = new Date(); return function() { var context = this, args = arguments, curTime = new Date(); clearTimeout(timeout); // 如果達(dá)到了規(guī)定的觸發(fā)時(shí)間間隔,觸發(fā) handler if (curTime - startTime >= time) { fun.apply(context, args); startTime = curTime; // 沒達(dá)到觸發(fā)間隔,重新設(shè)定定時(shí)器 } else { timeout = setTimeout(function(){ fun.apply(context, args); }, delay); } }; };
就是在判斷完時(shí)間間隔后再加個(gè)計(jì)時(shí)器來延遲,這個(gè)我覺得加不加都行,加了也沒錯(cuò)跟時(shí)間判斷互補(bǔ),不加也能實(shí)現(xiàn)節(jié)流的效果。
第二類寫法:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>函數(shù)節(jié)流</title> <style> div{ font-size:40px; color:red; text-align: center; } </style> </head> <body> <div>0</div> <script> var a=0; var oDiv=document.getElementsByTagName('div')[0]; var throttle=function(fn,time){ var timer=null; return function(){ var arg=arguments; var context=this; if(timer){ return false; } else{ timer=setTimeout(function(){ clearTimeout(timer); timer=null; fn.apply(context,arg); },time); } }; }; window.onmousemove=throttle(function(){ a++; oDiv.innerText=a+""; },2000); </script> </body> </html>
這種寫法通過判斷是否存在正在進(jìn)行的計(jì)時(shí)器來決定是否執(zhí)行函數(shù),存在就結(jié)束運(yùn)行函數(shù),但是那個(gè)計(jì)時(shí)器仍在隊(duì)列里進(jìn)行實(shí)踐一到還會(huì)執(zhí)行,通過運(yùn)行也能達(dá)到節(jié)流,也就是間隔固定的時(shí)間觸發(fā)函數(shù),但是我就是不太喜歡這種寫法??赡苁沁@種方法沒第一種直接吧。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
bootstrap table實(shí)現(xiàn)單擊單元格可編輯功能
這篇文章主要為大家詳細(xì)介紹了bootstrap table實(shí)現(xiàn)單擊單元格可編輯功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03常見的JavaScript內(nèi)存錯(cuò)誤及解決方法
這篇文章主要介紹了常見的JavaScript內(nèi)存錯(cuò)誤,JavaScript?不提供任何內(nèi)存管理操作。相反,內(nèi)存由?JavaScript?VM?通過內(nèi)存回收過程管理,該過程稱為垃圾收集。下面我們就來看看下面文章對(duì)JavaScript內(nèi)存錯(cuò)誤的各種舉例說明吧2021-12-12Highcharts 多個(gè)Y軸動(dòng)態(tài)刷新數(shù)據(jù)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄狧ighcharts 多個(gè)Y軸動(dòng)態(tài)刷新數(shù)據(jù)的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05百度地圖去掉marker覆蓋物或者去掉maker的label文字方法
下面小編就為大家分享一篇百度地圖去掉marker覆蓋物或者去掉maker的label文字方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法
本文給大家簡單總結(jié)了下JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法,非常的簡單實(shí)用,有需要的小伙伴可以參考下2016-06-06layui的數(shù)據(jù)表格+springmvc實(shí)現(xiàn)搜索功能的例子
今天小編就為大家分享一篇layui的數(shù)據(jù)表格+springmvc實(shí)現(xiàn)搜索功能的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09javascript?Echart可視化學(xué)習(xí)
這篇文章主要為大家介紹了Echart可視化學(xué)習(xí)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01js實(shí)現(xiàn)的標(biāo)題欄新消息閃爍提示效果
這篇文章主要介紹了js實(shí)現(xiàn)的標(biāo)題欄新消息閃爍提示效果,一些大型網(wǎng)站也會(huì)經(jīng)常用到這個(gè)效果,需要的朋友可以參考下2014-06-06