理解JS防抖与节流及应用场景

104 阅读2分钟

理解JS防抖与节流及应用场景

概念与例子

函数防抖(debouncce)

在事件被触发n秒后在执行回调,如果在这n秒内又被触发,则重新计时

函数节流(throttle)

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

形象比喻例子:

节流防抖就好比乘电梯,比如delay是10秒,name防抖就是电梯每进来一个人就要等10秒再运行,而节流就是电梯保证每10秒可以运行一次

总结:假设无限次触发:防抖函数永远不会真正执行;节流函数则会按照间隔时间执行

函数封装与解释

防抖函数

思路:当事件触发时要经过防抖函数的拦截再进行触发,如果是第一次触发,则设置定时器,到n秒后自动触发,如果不是第一次触发,则有可能是连续触发,所以要清除定时器再重新计时,等到时间到n秒后再执行原函数。

<input id="input" >
    
    <script>
        let input = document.getElementById("input")
        function print(e){
     
            console.log(e.target.value)
        }
        let dounbuceP = dounbuce(print, 1000)

        input.addEventListener("keyup", function(e){
            dounbuceP(e)
        } )


        function dounbuce(fn, dalay){
            t = null
            return function () {
                let that = this,
                _args = arguments
                clearTimeout(t)
                t = setTimeout(() => {
                    t = null
                    fn.apply(that, _args)
                }, dalay)
            }
        }
    </script>

解释:为什么要fn.apply,因为这里是封装函数,需要尽量考虑周全。

节流函数

思路:既然在特定间隔的时间中一定要触发某个函数,那就需要设定开始时间和获取当前时间,通过时间差来判断是否要执行函数,如果没有达到这个时间,则再设置一个定时器等待执行,如果达到了,则立即执行,同时,开始时间要重置为当前时间。

throttle(fn, delay) {
				let t = null,
					begin = new Date().getTime();
				return function() {
					let _self = this,
						args = arguments,
						cur = new Date().getTime();
					clearTimeout(t)

					if (cur - begin >= delay) {
						console.log(cur)
						fn.apply(_self, args);
						begin = cur
					} else {
						t = setTimeout(function() {
							console.log("set")
							console.log(cur)
							fn.apply(_self, args)
						}, delay)
					}
				}
			},