✨ 介绍防抖节流原理、区别以及利用,并用JavaScript进行实现
  1. 防抖
  • 原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则从新计时。
  • 实用场景:

    • 按钮提交场景:避免屡次提交按钮,只执行最初提交的一次
    • 搜寻框联想场景:避免联想发送申请,只发送最初一次输出
// 简易版实现function debounce(func, wait=1000) {    let timeout;    return function (args) {        clearTimeout(timeout)        timeout = setTimeout(function(){            func.apply(this, args)        }, wait);    }}
// 立刻执行版实现,有时心愿立即执行函数,而后等到进行触发 n 秒后,才能够从新触发执行。function debounce(func, wait=5000, immediate=true) {    let timeout;    return function (args) {        if (timeout) clearTimeout(timeout);        if (immediate) {            const callNow = !timeout;            timeout = setTimeout(function () {                timeout = null;            }, wait)            if (callNow) func.apply(this, args)        } else {            timeout = setTimeout(function () {                func.apply(this, args)            }, wait);        }    }}
/**func函数可能会有返回值,所以须要返回函数后果,然而当 immediate 为 false 的时候因为应用了 setTimeout 咱们将 func.apply(context, args) 的返回值赋给变量最初再 return 的时候,值将会始终是 undefined所以只在 immediate 为 true 的时候返回函数的执行后果*/function debounce(func, wait, immediate) {    let timeout, result;    return function (args) {        if (timeout) clearTimeout(timeout);        if (immediate) {            const callNow = !timeout;            timeout = setTimeout(function () {                timeout = null;            }, wait)            if (callNow) result = func.apply(this, args)        }        else {            timeout = setTimeout(function () {                func.apply(this, args)            }, wait);        }        return result;    }}
  1. 节流
  • 原理:规定在一个单位工夫内,只能触发一次函数。如果这个单位工夫内触发屡次函数,只有一次失效。
  • 实用场景:

    • 拖拽场景:固定工夫内只执行一次,避免超高频次触发地位变动
    • 缩放场景:监控浏览器resize
/* 应用工夫戳实现应用工夫戳,当触发事件的时候,咱们取出以后的工夫戳,而后减去之前的工夫戳(最一开始值设为 0 ),如果大于设置的工夫周期,就执行函数,而后更新工夫戳为以后的工夫戳,如果小于,就不执行。*/function throttle(func, wait) {  let previous = 0;  return function (args) {    let now = +new Date();    if (now - previous > wait) {      func.apply(this, args);      previous = now;    }  }}
/*应用定时器实现当触发事件的时候,咱们设置一个定时器,再触发事件的时候,如果定时器存在,就不执行,直到定时器执行,而后执行函数,清空定时器,这样就能够设置下个定时器。*/function throttle(func, wait) {  let timeout;  return function (args) {    if (!timeout) {      timeout = setTimeout(function () {        timeout = null;        func.apply(this, args)      }, wait)    }  }}
/** 防抖: * 利用场景:当用户进行了某个行为(例如点击)之后。 不心愿每次行为都会触发办法,而是行为做出后, 一段时间内没有再次反复行为, * 才给用户响应 * 实现原理 : 每次触发事件时设置一个延时调用办法, 并且勾销之前的延时调用办法。 (每次触发事件时都勾销之前的延时调用办法) *  @params fun 传入的防抖函数(callback) delay 等待时间 *  */const debounce = (fun, delay = 500) => {    let timer = null //设定一个定时器    return function (...args) {        clearTimeout(timer);        timer = setTimeout(() => {            fun.apply(this, args)        }, delay)    }}
/** 节流 *  利用场景:用户进行高频事件触发(滚动), 但在限度在n秒内只会执行一次。 *  实现原理: 每次触发工夫的时候, 判断以后是否存在期待执行的延时函数 * @params fun 传入的防抖函数(callback) delay 等待时间 * */const throttle = (fun, delay = 1000) => {    let flag = true;    return function (...args) {        if (!flag) return;        flag = false        setTimeout(() => {            fun.apply(this, args)            flag = true        }, delay)    }}

区别:节流不论事件触发多频繁保障在肯定工夫内肯定会执行一次函数。防抖是只在最初一次事件触发后才会执行一次函数