JavaScript函數(shù)節(jié)流的兩種寫法
最近看了函數(shù)節(jié)流的相關(guān)內(nèi)容,具體什么是節(jié)流我不討論了,網(wǎng)上很多,這里總結(jié)下兩個方法,我只認(rèn)可其中一個。另一個貌似也能達(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ā)時間間隔,觸發(fā) handler
var remaing=wait-(curTime-startTime)
if(remaing<=0||remaing>wait){//按理說remaing足夠證明已經(jīng)到了時間間隔,但是為了防止客戶端修改了時間所以加個條件(為什么這么加我也不懂)
fn.apply(context,arg);
startTime=curTime;
}
};
};
window.onmousemove=throttle(function(){
a++;
oDiv.innerText=a+"";
},2000);
</script>
</body>
</html>
我比較認(rèn)可這個方法,另外這是簡潔版,還有一種可以是這樣子的
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ā)時間間隔,觸發(fā) handler
if (curTime - startTime >= time) {
fun.apply(context, args);
startTime = curTime;
// 沒達(dá)到觸發(fā)間隔,重新設(shè)定定時器
} else {
timeout = setTimeout(function(){
fun.apply(context, args);
}, delay);
}
};
};
就是在判斷完時間間隔后再加個計時器來延遲,這個我覺得加不加都行,加了也沒錯跟時間判斷互補,不加也能實現(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)行的計時器來決定是否執(zhí)行函數(shù),存在就結(jié)束運行函數(shù),但是那個計時器仍在隊列里進(jìn)行實踐一到還會執(zhí)行,通過運行也能達(dá)到節(jié)流,也就是間隔固定的時間觸發(fā)函數(shù),但是我就是不太喜歡這種寫法??赡苁沁@種方法沒第一種直接吧。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
JS+canvas五子棋人機對戰(zhàn)實現(xiàn)步驟詳解
這篇文章主要介紹了JS+canvas五子棋人機對戰(zhàn)實現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Javascript必知必會(四)js類型轉(zhuǎn)換
這篇文章主要介紹了Javascript必知必會(四)js類型轉(zhuǎn)換 的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06

