节流与防抖

节流

  • throttle节流:减少请求资源,比如mouseove或resize事件会重复触发,使用throttle可以减少事件触发次数。实现原理是,在一段时间内只能完成固定次数请求,比如去火车站安检,一次只能过几个人,后边进行排队,避免前面发生拥挤。

    1. // 事件戳方法
    2. function throttle(callback, wait) {
    3. let pre = Date.now();
    4. return function () {
    5. let now = Date.now();
    6. if (now - pre >= wait) {
    7. fn.apply(this, arguments);
    8. pre = Date.now();
    9. }
    10. };
    11. }
    12. function handle() {
    13. console.log(Math.random());
    14. }
    15. window.addEventListener("mouseover", throttle(handle, 1000))
    1. // 定时器方法
    2. function throttle(callback, wait) {
    3. let timer = null;
    4. return function () {
    5. if (!timer) {
    6. timer = setTimeout(function () {
    7. callback.apply(this, arguments);
    8. timer = null;
    9. }, wait);
    10. }
    11. };
    12. }
    13. function handle() {
    14. console.log(Math.random());
    15. }
    16. window.addEventListener("mouseover", throttle(handle, 1000));

    防抖

  • debounce防抖:防抖是过了多久后才会执行的事件。 常见的input输入,根据输入数据发送接口请求【匹配相似关键词】。由于在输入过程中会有停顿,不确定什么时候输入完成,需要通过防抖机制,【输入词停顿300毫秒后表示输入完成,发送模糊接口请求】。 现实生活中的坐电梯时,电梯关门会一直等最后一个人进入停顿一段时间后才关门。

    防抖分为非立即执行函数和立即执行函数

  • 非立即执行函数:函数触发后不会立即执行,要等防抖设置的时间后才执行。等电梯的过程是非立即执行。

    非立即执行版的意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

  1. function debounce(callback, wait) {
  2. let timeout = null;
  3. return function () {
  4. if (timeout) clearTimeout(timeout);
  5. timeout = setTimeout(() => {
  6. callback.apply(this, arguments);
  7. }, wait);
  8. };
  9. }
  10. function handle() {
  11. console.log(Math.random());
  12. }
  13. window.addEventListener("mouseover", debounce(handle, 1000));
  • 立即执行:先执行一次,输入框中有一个值时可以先立即执行下接口请求。触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。
    1. function debounce(callback, wait){
    2. let timeout = null;
    3. return function(){
    4. if(timeout) clearTimeout(timeout);
    5. let runEvent = !timeout;
    6. timeout = setTimeout(()=>{
    7. timeout = null;
    8. }, wait)
    9. if(runEvent) callback.apply(this, arguments)
    10. };
    11. }
    12. function handle() {
    13. console.log(Math.random());
    14. }
    15. window.addEventListener("mouseover", debounce(handle, 1000));

参考链接:https://juejin.cn/post/6844903651278848014