1.函数防抖

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
大招吟唱:防抖

  1. 获取页面上classcontainerdiv
  2. 给他添加onmousemove鼠标移动事件添加防抖函数,让他在移出后0.3秒执行
  3. //封装的防抖函数
  4. function debounce(func,wait){
  5. let timeout;
  6. // 产生闭包,timeout不会被回收和重复声明会存活下来直到被cleanTimeout
  7. return function(){
  8. //获取到了调用执行函数container,存储当前this;
  9. let _this = this;
  10. //由于调用的func的事件对象是undefined所以将当前的argument付给他让他也能用事件对象e
  11. let args = arguments;
  12. clearTimeout(timeout);
  13. timeout = setTimeout(function(){
  14. //将调用的函数的this指向window
  15. //apply将this的指向改指为括号里的方法
  16. func.apply(_this,args)
  17. },wait);
  18. }
  19. }
  20. let count = 0;
  21. let container = document.querySelector('.container');
  22. function dosomeTing(e){
  23. //可能回调
  24. console.log(e);
  25. container.innerHTML = count++;
  26. }
  27. container.onmousemove = debounce(dosomeTing,300);
  28. //因为oonmousemove需要接收一个函数,所以需要return一个函数

2.函数节流

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。
大招冷却:节流
1、通过时间戳,会立即执行一次,但最后一次不触发

  1. function throttle(func,wait){
  2. let _this,args;
  3. let old = 0;
  4. return function(){
  5. let now = new Date().valueOf();
  6. _this = this;
  7. args = arguments;
  8. if(now-old > wait){
  9. //会立即执行第一次
  10. func.apply(_this,args);
  11. old = now;
  12. }
  13. }
  14. };
  15. function dosomeTing(){
  16. //可能回调
  17. container.innerHTML = count++;
  18. };
  19. let count = 0;
  20. let container = document.querySelector('.container');
  21. container.onmousemove = throttle(dosomeTing,2000);

2.通过定时器,开头不执行,结尾执行

  1. function throttle(func,wait){
  2. let _this,args,timeout;
  3. return function(){
  4. _this = this;
  5. args = arguments;
  6. if(!timeout){
  7. timeout = setTimeout(function(){
  8. func.apply(_this,args);
  9. //不能用cleanTimeout因为清除定时器后变量还留着定时器id
  10. //调用之后必须清空不然timeout就会一直有东西无法进if语句
  11. timeout = null;
  12. },wait)
  13. };
  14. return;
  15. }
  16. };
  17. function dosomeTing(){
  18. //可能回调
  19. container.innerHTML = count++;
  20. };
  21. let count = 0;
  22. let container = document.querySelector('.container');
  23. container.onmousemove = throttle(dosomeTing,2000);

3.VIP付费骗傻子版版,开头执行,结尾执行

  1. function throttle(func,wait){
  2. let args,timeout,_this;
  3. let old = 0;
  4. return function(){
  5. _this = this;
  6. args = arguments;
  7. let now = new Date().valueOf();
  8. if(now-old>wait){
  9. if(timeout){
  10. //时间戳加一时,清除定时器让其重新开始
  11. clearTimeout(timeout);
  12. timeout = null;
  13. }
  14. old = now;
  15. func.apply(_this,args);
  16. }else if(!timeout){
  17. timeout = setTimeout(function(){
  18. //定时器加一时,将旧时间戳顶为当前时间重新开始
  19. old = new Date().valueOf();
  20. func.apply(_this,args);
  21. timeout = null;
  22. },wait);
  23. }
  24. }
  25. }
  26. let container = document.querySelector('.container');
  27. let count = 0;
  28. function mose(){
  29. container.innerHTML = count++;
  30. }
  31. container.onmousemove = throttle(mose,2000);

3.函数防抖是间隔超过一定时间后才会执行,函数节流是一定时间段内只执行一次。

节流和防抖都是让执行次数减少,减小服务器压力