这一次彻底搞懂JS中的防抖和节流(面试必问)

简介: 这一次彻底搞懂JS中的防抖和节流(面试必问)

什么是防抖?

通过setTimeout的方式,在一定的时间间隔内,将多次触发变成一次触发。(通俗的说是在最后一次点击间隔规定时间之后才能再次成功触发,否则触发不成功)

防抖的实现思路

  1. 在防抖函数返回的函数的上级作用域设置一个定时器变量t置为null;
  2. 通过t来判断是否是第一次执行。
  3. 如果不是第一次执行,清空定时器
  4. 如果是第一次执行,则通过apply(this,arguments)进行执行.
  5. 最后设置定时器,规定时间之后将t设置为null,使得间隔时间之后t为null,间隔时间之后的点击变为第一次点击。

防抖实现代码

const btn = document.querySelector('#input');
btn.addEventListener('click',debounce(submit,3000),false);
function submit(e) {
    console.log(1);
}
// 防抖函数:最后一次点击之后,3秒之内的点击都无效
function debounce(fn,timer) {
    let t = null;
    return function() {
        // 判断是否是第一次执行
        let firstClick = !t;
        // 如果不是第一次执行,则清空延时  之所以要清空延时就是要防止前面的定时器对最新的定时器产生影响,
        if (t) { clearTimeout(t)};
        // 如果是第一次执行则直接执行
        if (firstClick) {
            fn.apply(this,arguments)
        }
        // 在第一次点击之后 间隔的规定时间之后,才将t置为null 为下一次第一次点击做准备
        t = setTimeout(() => {
            t = null;                    
        },timer)
    }
}
复制代码

codeSandBox在线演示


什么是节流?

节流指的是减少一段时间内的触发频率。只有在上一次成功触发间隔规定时间之后,才能再次触发。

节流的实现思路

  1. 在返回函数的上级作用域定义一个初始时间值begin = 0;
  2. 获取当前时间戳,如果(当前时间戳 - 初始值 > 规定时间间隔)则通过apply修改this指向并传参;
  3. 修改初始值为当前值;

节流实现代码

const btn = document.querySelector('#input');
btn.addEventListener('click',throttle(submit,2000),false);
function submit(e) {
    console.log(1);
}
// 节流函数:减少一段时间的触发频率,只有在上一次成功触发 间隔规定时间之后才能再次成功触发。
function throttle(fn,delay) {
    let begin = 0;
    return function() {
        let cur = new Date().getTime();
        if (cur - begin > delay) {
            fn.apply(this,arguments);
            begin = cur;
        }
    }
}
复制代码

codeSandBox在线演示

节流与防抖的区别是什么?

  1. 防抖只在最后一次成功点击之后间隔规定时间之后才能再次成功触发,如果在时间间隔之内就被点击,需要重新间隔时间间隔才能点击。
  2. 节流则不同,节流只要在上一次成功触发规定时间之后点击就能再次触发,中间的触发不会产生影响。
相关文章
|
2天前
|
前端开发 JavaScript
JavaScript新科技:PostCSS的安装和使用,2024年最新2024网易Web前端高级面试题总结
JavaScript新科技:PostCSS的安装和使用,2024年最新2024网易Web前端高级面试题总结
|
2天前
|
前端开发 JavaScript
JavaScript:this-关键字,2024中级前端开发面试解答
JavaScript:this-关键字,2024中级前端开发面试解答
|
2天前
|
JSON JavaScript 前端开发
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
|
2天前
|
JavaScript 前端开发 程序员
web前端入门到实战:32道常见的js面试题(1),面试哪些
web前端入门到实战:32道常见的js面试题(1),面试哪些
|
2天前
|
前端开发 JavaScript
web前端JS高阶面试题,2024我的前端大厂面试之旅
web前端JS高阶面试题,2024我的前端大厂面试之旅
|
2天前
|
JavaScript 前端开发
web前端JS高阶面试题(1),高级开发工程师面试
web前端JS高阶面试题(1),高级开发工程师面试
|
2天前
|
JSON 前端开发 JavaScript
【JavaScript】面试手撕深拷贝(2),2024年最新nacos面试题及答案
【JavaScript】面试手撕深拷贝(2),2024年最新nacos面试题及答案
【JavaScript】面试手撕深拷贝(2),2024年最新nacos面试题及答案
|
2天前
|
JSON JavaScript 前端开发
【JavaScript】面试手撕深拷贝(1),面试前必看的一本书书籍是什么
【JavaScript】面试手撕深拷贝(1),面试前必看的一本书书籍是什么
|
2天前
|
缓存 前端开发 JavaScript
Javascript模块化开发基础,最新美团点评前端团队面试题
Javascript模块化开发基础,最新美团点评前端团队面试题
|
3天前
|
JavaScript 前端开发 程序员
javascript基础(入门),当上项目经理才知道,推荐程序员面试秘籍
javascript基础(入门),当上项目经理才知道,推荐程序员面试秘籍