27.JavaScript实现函数防抖和函数节流
程序员文章站
2022-06-27 20:34:03
1.JavaScrip实现函数防抖 this.myPlugin = this.myPlugin || {}; /** * 函数防抖,某个函数调用过于频繁,想在一段时间后调用该函数 */ this.myPlugin.debounce = function (callback, time) { var ......
1.javascrip实现函数防抖
this.myplugin = this.myplugin || {}; /** * 函数防抖,某个函数调用过于频繁,想在一段时间后调用该函数 */ this.myplugin.debounce = function (callback, time) { var timer = null; //通过闭包存储计时器 return function () { timer && cleartimeout(timer); //每次执行前,将计时器清空 var args = arguments; //利用闭包,保存每次传入的形参 timer = settimeout(function () { callback.apply(null, args); }, time); }; };
调用函数防抖:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>document</title> </head> <body> <input type="text"> <script src="./js/myplugin.js"></script> <script> var inp = document.getelementsbytagname("input")[0]; //输入框,若一秒内没有输入内容,则输出输入框中的内容 var handle = myplugin.debounce(function (val, inp) { console.log(val); console.log("inp是this指向:" + inp); }, 1000); inp.oninput = function () { handle(this.value, this) }; </script> </body> </html>
效果展示:
2.javascript实现函数节流:
this.myplugin = this.myplugin || {}; /** * 函数防抖,某个函数调用过于频繁,想在一段时间后调用该函数 * 如:某个动作结束后,一秒后执行该函数 */ this.myplugin.debounce = function (callback, time) { var timer = null; //通过闭包存储计时器 return function () { timer && cleartimeout(timer); //每次执行前,将计时器清空 var args = arguments; //利用闭包,保存每次传入的形参 timer = settimeout(function () { callback.apply(null, args); }, time); }; }; /** * 函数节流,保证每隔一段时间,某个函数只执行一次 * 如:某个动作操作时,每一秒后执行一次该函数 */ this.myplugin.throttle = function(callback, time, immediately){ !immediately && (immediately = false);//默认赋值为false var timestamp,//时间戳 timer = null;//利用闭包存储计时器 return function(){ if(immediately){//立即执行后,在每隔一段时间执行一次 if(!timestamp || (timestamp - date.now()) > time){// callback.apply(null, args); timestamp = date.now(); } }else{//每隔一段时间后执行一次 if(timer){//计时器有值,则直接return return; } var args = arguments;//利用闭包,保存每次传入的形参 timer = settimeout(function(){ callback.apply(null, args); timer = null;//执行完本次函数,要清空计时器 }, time); } }; };