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

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日

相关文章

  • JavaScript URL参数读取改进版

    下面我来详细讲解一下“JavaScript URL参数读取改进版”的完整攻略。 一、背景介绍 在前端开发中,我们经常需要从URL中获取参数,以便进行后续操作。而通过JavaScript获取URL参数是一种常见且重要的操作。 然而,传统的JavaScript URL参数读取方法存在一些问题,比如需要手动解析URL,代码冗长,逻辑混乱等。这些问题导致了使用不便、…

    JavaScript 2023年5月19日
    00
  • 浅析javascript的间隔调用和延时调用

    浅析javascript的间隔调用和延时调用 在JavaScript中,有两种常见的调用方式:间隔调用和延时调用。 延时调用 延时调用意思是在一段时间之后才执行函数,在JavaScript中使用setTimeout()方法来实现。 setTimeout()方法需要接收两个参数,第一个参数是要执行的函数,第二个参数是时间(单位为毫秒)。在例子中,代码会在3秒之…

    JavaScript 2023年6月11日
    00
  • JavaScript奇技淫巧44招【实用】

    JavaScript奇技淫巧44招【实用】攻略 作为一名网站开发者,熟练掌握JavaScript的技巧和小技巧是非常重要的。下面是44个实用的JavaScript奇技淫巧,以及它们的用法和示例说明。 1. 使用逻辑运算符和函数默认值进行简化 function multiply(a, b) { b = typeof b !== ‘undefined’ ? b …

    JavaScript 2023年5月18日
    00
  • javascript:;与javascript:void(0)使用介绍

    当我们在HTML中使用”href”属性来定义一个链接时,有时会使用”javascript:”或”javascript:void(0)”作为链接的href值。这两个值虽然都可以用来防止页面跳转,但它们的作用是有所不同的。 “javascript:;” “javascript:;”这个值通常用来防止a标签产生默认跳转行为,因为当a标签的href属性的值为空时,点…

    JavaScript 2023年5月17日
    00
  • JavaScript中while循环的基础使用教程

    当我们需要重复执行一段代码时,可以使用循环。JavaScript 提供了多种循环类型,其中 while 循环是最基本也是最易于理解的一种。本文将详细介绍 JavaScript 中 while 循环的基础使用教程。 while 循环的基本语法 while 循环的基本语法如下: while (condition) { // code to be executed…

    JavaScript 2023年5月28日
    00
  • javascript删除一个html元素节点的方法

    要删除一个HTML元素节点,可以使用JavaScript中的removeChild方法。下面是使用removeChild方法删除HTML元素节点的完整攻略: 步骤一:获取要删除的HTML元素节点 在上述步骤的示例代码中,我们想要删除一个 元素节点。因此,我们需要使用JavaScript的document.getElementById()或document.q…

    JavaScript 2023年6月10日
    00
  • 探讨JavaScript语句的执行过程

    我们来详细讲解一下“探讨JavaScript语句的执行过程”的完整攻略: 什么是JavaScript语句的执行过程? 在JavaScript中,语句的执行过程是指将代码逐行解释并执行的过程,然后将执行结果返回到执行环境中。JavaScript语句执行的过程是从上到下进行的。 在执行JavaScript代码时,代码的执行被分为两个步骤:编译和执行。编译是指将代…

    JavaScript 2023年5月18日
    00
  • Web前端新人笔记之jquery入门心得(新手必看)

    来详细讲解一下“Web前端新人笔记之jquery入门心得(新手必看)”的完整攻略。 1. 前言 在介绍 jQuery 入门心得之前,需要先了解什么是 jQuery。jQuery 是一款快速、简洁的 JavaScript 库,是为了更简单地操作 HTML 文档、处理事件、实现动画效果和数据交互等功而开发的。jQuery 支持主流的浏览器,并且具有代码简洁、开发…

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