/**
* 函數防抖
* @param {function} fn 執行函數
* @param {number} delay 延遲時間 毫秒
* @param {boolean} immediately 是否立刻執行函數
*/
function debounce(fn,delay,immediately){
var timer = null,firstInvoke=true;
return function(){
if(timer) {
console.log('操作過于頻繁');
clearTimeout(timer);
}
if(immediately && firstInvoke){
fn.apply(this,arguments);
firstInvoke=false;
return;
}
timer=setTimeout(()=>{
fn.apply(this,arguments);
timer=null;
firstInvoke=true;
},delay);
}
}
/**
* 函數節流
* @param {function} fn 執行函數
* @param {number} wait 等待時間 毫秒
* @param {boolean} immediately 是否立刻執行函數
*/
function throttle(fn,wait,immediately){
if(immediately){
var executetime;
return function(){
//首次執行 或者 距離上次執行的時間超過等待時間
if(!executetime ||Date.now()-executetime>=wait){
fn.apply(this,arguments);
executetime=Date.now();//記錄本次執行時間
}
}
}else{
var timer;
return function () {
if(timer) return;
timer=setTimeout(()=>{
fn.apply(this,arguments);
timer=null;
},wait);
}
}
}