前端面试——JS篇(什么是防抖和节流?手写防抖、节流函数)

一、防抖

防抖是什么?

单位时间内,频繁触发事件,只执行最后一次

防抖有什么使用场景呢?

(1)  搜索框输入。只需要用户最后一次输入完,再发送请求

(2)  手机号、邮箱验证输入监测

二、节流

节流是什么?

单位时间内,频繁触发事件,只执行一次

节流有什么使用场景呢?

鼠标移动mousemove、页面尺寸缩放resize、滚动条滚动scroll等

举个例子

王者荣耀技能冷却,期间无法继续释放技能

和平精英98k换子弹期间不能射击

接下来手写防抖函数和节流函数:

(1)手写防抖函数

// 手写一个防抖函数
        const box = document.querySelector('.box')
        let i = 1;
        function mouseMove() {
            box.innerHTML = i++
        }

        function debounce(fn, t) {
            // 核心是利用settimeout定时器来实现
            // 1.声明定时器变量
            // 2.每次鼠标移动都要判断是否有定时器,如果有先清除以前的定时器
            // 3.如果没有,则开启定时器,存入到定时器变量里面
            // 4.定时器里面写函数调用

            let timer;
            return function () {
                if (timer) clearTimeout(timer)
                timer = setTimeout(function(){
                        fn()
                    },t)
            }
        }
        box.addEventListener('mousemove', debounce(mouseMove, 500))

(2)手写节流函数

<script>
        const box = document.querySelector(".box")
        let i = 1
        function mouseMove() {
            box.innerHTML = i++
        }
        // 手写一个节流函数
        function throttle(fn, t) {
            // 节流函数的核心就是利用定时器来实现
            // 1.声明一个定时器变量
            // 2.当鼠标移动(事件触发)先判断是否有定时器了,如果有定时器了,则不开启新的定时器了
            // 3.如果没有定时器则开启定时器,记得存到变量里面
            //   3.1  定时器里面调用执行的函数
            //   3.2 定时器里面要把定时器清空
            let timer = null
            return function () {
                if (!timer) {
                    timer = setTimeout(function () {
                        fn()
                        timer = null
                        // 在开启的定时器里面不能够清空定时器,不能使用clearTimeout
                    }, t)
                }
            }


        }
        box.addEventListener('mousemove', throttle(mouseMove, 300))
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值