zoukankan      html  css  js  c++  java
  • 什么是防抖和节流?

    简介

    虽然二者都有延迟当前动作的反馈,但是防抖的延迟时间是确定的,延迟周期内如果有新动作进入,旧的动作将会被取消。

    而节流是提前设置了一个阀门,只有当阀门打开的时候,该动作才有机会执行。如果阀门是关闭的,那这个动作就不会进入执行区。个人理解防抖是后置的处理高频事件方式,而节流是前置处理。防抖机制隐含了一个优先级的概念,后到的先执行,因此事件的进入事件越晚优先级实则越高,而优先级最高的具备执行权,而进入时间这个准入条件是不由开发者提前预设的,事件的执行更加离散无规则。而缓冲机制并没有为事件分配权重,只是设置了一个均匀频率的信号量,该信号量的开启和关闭是决定能否进入执行区的条件,而与事件无关,准入条件是人为设置的,相对来说执行更规律。

    带有立即执行的防抖实现

    /**
     * 带有立即执行的防抖
     * @param {*} fn 
     * @param {*} wait 
     * @param {*} immediate 
     */
    function debounce(fn, wait = 50, immediate = true) {
        let args
        let self
        let timer
        let delay = () => {
            return setTimeout(() => {
                timer = null
                if (!immediate) {
                    fn.apply(self, args)
                }
            }, wait);
        }
        return function (...params) {
            if (!timer) {
                timer = delay()
                if (immediate) {
                    fn.apply(this, params)
                } else {
                    args = params
                    self = this
                }
            } else {
                clearTimeout(timer)
                timer = delay()
            }
        }
    }
    debounce(()=>{console.log(1)},50,false)()
    

    节流实现

    const throttle=(fn, wait = 50)=>{
        let isCan=true
        return function(){
            if(!isCan) return
            isCan=false
            setTimeout(() => {
                fn.apply(this, arguments);
                isCan=true
            }, wait);
        }
    }
    let func = throttle(()=>{console.log(1)},1050)
    func()
    func()
    
  • 相关阅读:
    实现图片旋转木马3D浏览效果
    !important的用法
    css中!important的作用
    js深拷贝和浅拷贝
    Javascript 数组循环遍历之forEach
    javascript高级选择器querySelector和querySelectorAll
    CSS3系列教程:HSL 和HSL
    linux 静态库、共享库
    UNIX网络编程之旅-配置unp.h头文件环境
    apue2e unp安装
  • 原文地址:https://www.cnblogs.com/fuGuy/p/13621044.html
Copyright © 2011-2022 走看看