这一次彻底搞懂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. 节流则不同,节流只要在上一次成功触发规定时间之后点击就能再次触发,中间的触发不会产生影响。
相关文章
|
3月前
|
JSON JavaScript 前端开发
Javascript基础 86个面试题汇总 (附答案)
该文章汇总了JavaScript的基础面试题及其答案,涵盖了JavaScript的核心概念、特性以及常见的面试问题。
63 3
|
3月前
|
前端开发 JavaScript
JavaScript 面试系列:如何理解 ES6 中 Generator ?常用使用场景有哪些?
JavaScript 面试系列:如何理解 ES6 中 Generator ?常用使用场景有哪些?
|
4月前
|
JavaScript 前端开发
常见的JS面试题
【8月更文挑战第5天】 常见的JS面试题
63 3
|
1月前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
35 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
3月前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
111 57
|
2月前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
47 1
|
2月前
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题
|
3月前
|
JavaScript 前端开发
js防抖函数返回值问题解决方案
本文介绍了如何在JavaScript中创建一个带有返回值的防抖函数,通过结合Promise来实现。这种防抖函数可以在事件触发一定时间后再执行函数,并能处理异步操作的返回值。文章提供了防抖函数的实现代码和如何在实际项目中使用该防抖函数的示例。
40 1
|
4月前
|
JavaScript 前端开发 UED
JS 防抖与节流
防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。
41 1
JS 防抖与节流
|
4月前
|
存储 JavaScript 前端开发
2022年前端js面试题
2022年前端js面试题
46 0