函数防抖
频繁触发,只在特定的时间内执行一次代码。
应用场景:onrize,onscroll等频繁触发的函数,比如你想获取滚动条的位置,然后执行下一步动作
//函数防抖 function debounce(fn,delay){ let timer = null; return function (){ let args = arguments; if(timer) clearTimeout(timer); timer = setTimeout(()=>{ fn.apply(this,args) },delay) } }
函数节流
频繁触发,但只在特定的时间内没有再次触发执行函数,函数才会真的去执行。
应用场景:输入框自动补全时间,频繁操作点赞取消点赞等。
function throttle(fn,delay){ let timer = null; return function(){ let args = arguments; if(timer) return; timer = setTimeout(()=>{ fn.apply(this,args) timer = null; },delay) } }
事例
<body> <button id="btn1">普通点击</button> <button id="btn2">防抖点击</button> <button id="btn3">节流点击</button> </body>
//普通点击 let btn1 = 0; document.getElementById('btn1').onclick = function() { console.log(btn1++)//点击多少次,打印多少次 } //防抖点击 let btn2 = 0; function fnBtn2(b) { btn2++; console.log(btn2,b) } let b2 = debounce(fnBtn2, 3000);//函数初始化 document.getElementById('btn2').onclick = function() { b2('b2')//3s之内停止点击才会执行 } //节流点击 let btn3 = 0; function fnBtn3(b) { btn3++; console.log(btn3,b) } let b3 = throttle(fnBtn3, 3000);//函数初始化 document.getElementById('btn3').onclick = function() { b3('b3')//无论点击多少次,只会每3s执行一次 }