防抖和节流

本文介绍了防抖和节流两种JavaScript优化技术。防抖技术用于限制函数的执行频率,在用户连续操作时避免过度调用,如防止多次点击导致的重复请求。节流技术则确保在一定时间内函数只执行一次,适用于处理滚动事件以减少处理频率。通过示例代码展示了如何实现防抖和节流函数,并在按钮点击事件中应用了防抖技术,以防止短时间内频繁添加列表项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

防抖

解释: 事件触发之后n秒之后才会执行回调函数, 如果在这个n秒之内再次触发这个事件 , 则重新计时
应用 : 可以用在一些用户点击事件上面 , 避免用户多次点击而向后端发送多次请求

		function debounce(fn , wait , args){
            let timer = null

            return ()=>{
                if(timer){
                    clearTimeout(timer)
                    timer = null
                }

                timer = setTimeout(() => {
                    let newargs = [...arguments].slice(2)
                    fn.apply(this,newargs)
                }, wait);
            }
        }

节流

解释 : 在一定时间内 , 这个函数只能被触发一次 , 如果在同一时间内这个函数被多次触发 , 只会有一次生效
应用 : 在一些滚动事件上面使用节流 , 可以降低事件触发的频率

function throttle(fn , delay){
            let curTime = Date.now()
        
            return ()=>{
                let nowTime = Date.now()

                if(nowTime-curTime >= delay){
                    //重新赋值
                    curTime = Date.now()
                    fn.apply(this,[...arguments].slice(2))
                }
            }


        }

小栗子:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        button {
            position: fixed;
            bottom: 50px;
            left: 50%;
        }
    </style>
</head>

<body>
    <ul>
        <li>12</li>
    </ul>
    <button>点击添加</button>

    <script>
        let btn = document.getElementsByTagName('button')[0]
        btn.addEventListener('click', throttle(add, 2000, 'lnl'))


        function debounce(fn , wait , args){
            let timer = null

			//箭头函数可以获取外层作用域的this , arguments
            return ()=>{
                if(timer){
                    clearTimeout(timer)
                    timer = null
                }

                timer = setTimeout(() => {
                    let newargs = [...arguments].slice(2)
                    fn.apply(this,newargs)
                }, wait);
            }
        }

     
        function throttle(fn , delay){
            let curTime = Date.now()
        
            return ()=>{
                let nowTime = Date.now()

                if(nowTime-curTime >= delay){
                    //重新赋值
                    curTime = Date.now()
                    fn.apply(this,[...arguments].slice(2))
                }
            }


        }


        function add(value) {
            let ul = document.getElementsByTagName('ul')[0]
            const newli = document.createElement('li')
            newli.innerHTML = value
            ul.appendChild(newli)
        }
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值