JavaScript函数节流概念与用法实例详解

yizhihongxing

JavaScript函数节流概念与用法实例详解

函数节流概念

函数节流是一种优化高频率执行某个函数的方案,它能够将您预设的函数以固定的时间间隔执行,避免函数过于频繁的被执行。常用于一些高频触发事件如滚动条滚动、鼠标移动、窗口大小改变等。

如何实现函数节流

在Javascript中,当我们需要实现函数节流时,最简单的方式是通过返回一个闭包函数,内部使用 setTimeout 来进行周期性处理。

function throttle(fn, delay) {
    let timer;
    return function() {
        clearTimeout(timer);
        timer = setTimeout(function() {
            fn.apply(this, arguments);
        }, delay);
    };
}

throttle 函数接收两个参数:

  • fn:要进行节流的函数。
  • delay:时间间隔,单位毫秒(ms)。

其中,内部利用 setTimeout 函数实现函数的延迟执行。如果在前一个周期内已经设置了 setTimeout,则先将其清除,再设置一个新的 setTimeout

使用实例

示例一:防抖 + 节流

假设我们有这样一个需求:在窗口缩放时,动态改变页面元素宽高,并且避免因窗口不停变化导致频繁调用。

可以将防抖和节流组合使用,实际上是先采用防抖,稍作等待后再采用函数节流。

function debounce(fn, delay) {
    let timer;
    return function() {
        clearTimeout(timer);
        timer = setTimeout(function() {
            fn.apply(this, arguments);
        }, delay);
    };
}

function throttle(fn, interval) {
    let lastTime, timer;
    return function() {
        let context = this, args = arguments;
        let nowTime = +new Date();
        if (lastTime && nowTime - lastTime < interval) { // 在规定时间内,直接返回
            clearTimeout(timer);
            timer = setTimeout(function() {
                lastTime = nowTime; // 更新最后执行时间
                fn.apply(context, args);
            }, interval);
        } else {
            lastTime = nowTime;
            fn.apply(context, args);
        }
    };
}

window.onresize = debounce(throttle(function() {
    console.log('time:', +new Date());
}, 500), 200);

上面的代码实现了在窗口缩放时,以防抖加函数节流的形式控制函数的执行,防止出现频繁调用的情况。其中:

  • 采用防抖函数 debounce 来处理函数的抖动。
  • 采用节流函数 throttle 来处理函数的频率。并在 window 对象上注册 onresize 事件。

示例二:滚动时图片懒加载

为了提高页面加载速度,可以采用图片懒加载的方式,使当前可视区域内的图片自动加载,提高用户体验。

但是,滚动时如何避免过度多次调用函数,导致页面性能问题?可以使用函数节流来解决:

function lazyload() {
    let imgs = document.getElementsByTagName('img');
    let len = imgs.length;
    let viewHeight = document.documentElement.clientHeight;
    for (let i = 0; i < len; i++) {
      let rect = imgs[i].getBoundingClientRect();
      if (rect.bottom >= 0 && rect.top < viewHeight) {
        if (imgs[i].getAttribute('src') === 'default.jpg') {
          imgs[i].src = imgs[i].getAttribute('data-src');
        }
      }
    }
}

window.addEventListener('scroll', throttle(lazyload, 500));

对于上述代码,我们在滚动时利用 window.addEventListener 监听 scroll 事件,并使用函数节流返回一个闭包函数来执行懒加载操作,从而避免多次调用、提高性能。

总结

通过学习,我们了解了JavaScript中的函数节流概念、如何实现函数节流、函数节流的应用场景以及两个实际应用的示例。函数节流不仅可以避免频繁执行函数,优化性能,也可以提高用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript函数节流概念与用法实例详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 显示js对象所有属性和方法的函数

    要显示 JS 对象的所有属性和方法,需要使用以下两种方法之一。 方法一:for…in 循环 使用 for…in 循环可遍历该对象所有可枚举的属性名称,从而显示对象的属性和方法。 function showProperties(obj) { for (var propName in obj) { console.log(propName); } } 该…

    JavaScript 2023年5月27日
    00
  • JS选取DOM元素常见操作方法实例分析

    针对“JS选取DOM元素常见操作方法实例分析”的攻略,我会给出完整的文本,涵盖标题、代码块等规范要求,并且会提供两个示例。 JS选取DOM元素常见操作方法实例分析 在前端开发中,JS能够操作DOM元素是非常重要的技能之一。在进行DOM操作时,首先需要选取相应的DOM元素。JS有多种方法可以选取DOM元素。接下来,我们将介绍一些常用的DOM选取方法。 通过id…

    JavaScript 2023年6月10日
    00
  • js Date()日期函数浏览器兼容问题解决方法

    下面是详细讲解“js Date()日期函数浏览器兼容问题解决方法”的攻略。 1. 问题描述 JavaScript 中的 Date() 是一个常用的日期函数,用于获取当前日期时间或指定日期时间。然而,在不同的浏览器中,Date() 函数存在兼容性问题,可能会出现不同的结果,导致代码出现 bug。因此,我们需要了解这些兼容性问题,并采取相应措施,以确保代码的正常…

    JavaScript 2023年5月27日
    00
  • 事件绑定之小测试 onclick && addEventListener

    事件绑定是 Web 开发中常用的技术。在 JavaScript 中,有多种方法可以实现事件绑定,其中包括 onclick 和 addEventListener。本文将介绍 onclick 和 addEventListener 的使用方法以及他们之间的区别,同时提供了两个示例,以帮助读者更好地理解事件绑定。 onclick onclick 是 JavaScri…

    JavaScript 2023年6月11日
    00
  • js获取浏览器的各种属性

    当我们需要编写网页时,能够获取浏览器属性的JS脚本的价值是非常巨大的。下面,我们将详细讲解下如何获取浏览器的各种属性。 1. 获取浏览器窗口大小 我们可以通过window.innerWidth和window.innerHeight属性来获取当前窗口的宽度和高度。以下是一个示例代码块: let windowWidth = window.innerWidth; …

    JavaScript 2023年6月11日
    00
  • Javascript Math toSource() 方法

    JavaScript中的Math对象并没有toSource()方法。toSource()方法是JavaScript中的一个对象方法,用于返回一个表示对象源代码的字符串。但是,Math对象是一个内置对象,不是一个普通的JavaScript对象,因此不支持toSource()方法。 作为替代,我们可以使用console.dir()方法来查看Math对象属性和方法…

    JavaScript 2023年5月11日
    00
  • JavaScript实现的一个日期格式化函数分享

    现在我来为你讲解如何实现JavaScript的一个日期格式化函数。 知识储备 在编写日期格式化函数之前,我们需要先掌握以下知识: JavaScript中的Date对象和相关API 正则表达式的基本使用 字符串的基本操作方法 编写思路 当我们要将一个日期格式化成指定的格式时,我们需要将日期对象转换成字符串,然后按照特定的格式进行拼接。 首先,我们需要传入两个参…

    JavaScript 2023年6月10日
    00
  • JS浏览器BOM常见操作实例详解

    JS浏览器BOM常见操作实例详解 JS浏览器BOM(Browser Object Model)是指浏览器对象模型,它提供了与浏览器窗口进行交互的API。BOM包含了window、navigator、document等对象,这些对象是直接映射到浏览器窗口的,可以通过JS编程来操作浏览器窗口。本文将详细讲解JS浏览器BOM常见操作实例,包括获取浏览器窗口尺寸、打…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部