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 DOM操作之动态删除TABLE多行

    我来给你详细讲解一下“JavaScript DOM操作之动态删除TABLE多行”的完整攻略。 什么是DOM操作? 在开始讲述删除TABLE多行的操作之前,先来简单介绍一下什么是DOM操作。DOM操作是指使用JavaScript对页面中的HTML元素进行增、删、改、查的操作。我们可以使用DOM操作改变页面中的元素的样式、内容、位置等等,从而实现我们所需的功能。…

    JavaScript 2023年6月10日
    00
  • JavaScript创建数组的方法详解

    JavaScript创建数组的方法详解 在JavaScript中创建数组的方法有很多,本文将详细讲解其中的6种方法。 1. 直接量 使用直接量的方式可以快速创建一个数组,只需要使用方括号[],并在其中用逗号隔开各元素。示例如下: let arr1 = [1, 2, 3]; 2. 使用new Array() 使用new Array()的方式也可以创建一个数组,…

    JavaScript 2023年5月27日
    00
  • javascript检查浏览器是否已经启用XX功能

    要检查浏览器是否支持某项功能,可以使用JavaScript内置的对象——Navigator对象。Navigator对象提供了许多信息,包括浏览器的名称、版本、操作系统和是否支持某些特定的功能。以下是检查浏览器是否支持某些功能的几种方法: 方法一:使用navigator对象的属性检查 Navigator对象的属性包含许多信息,其中一些属性可用于检查浏览器是否支…

    JavaScript 2023年6月11日
    00
  • JavaScript 入门基础知识 想学习js的朋友可以参考下

    JavaScript 入门基础知识 本文将介绍 JavaScript 的基础知识,适合想要入门学习 JavaScript 的朋友参考。包括变量、数据类型、运算符、条件语句、循环语句、函数等基础内容。 变量 变量是存储数据的容器,在 JavaScript 中通过 var、let、const 来声明变量。 // 声明变量并初始化 var name = &quot…

    JavaScript 2023年5月18日
    00
  • 如何动态加载外部Javascript文件

    动态加载外部 JavaScript 文件是指在页面运行时,通过 JavaScript 代码动态地向页面添加新的外部 JS 文件,并使其生效。这种方式可以提高页面的响应速度和减轻服务器压力,因为未使用的 JavaScript 代码不会提前加载,只有在需要时才被加载。 以下是实现动态加载外部 JavaScript 文件的完整攻略: 创建 <script&g…

    JavaScript 2023年5月27日
    00
  • 解决Django cors跨域问题

    让我来给您详细讲解解决Django CORS跨域问题的完整攻略。 什么是CORS跨域问题? CORS(Cross-Origin Resource Sharing)跨域资源共享问题,是由于同源策略(Same-Origin Policy)限制而导致的。同源策略指的是协议、域名、端口均相同,否则称之为跨域。在Web开发中,跨域问题是一种常见的问题,也是需要解决的问…

    JavaScript 2023年6月11日
    00
  • JavaScript中模拟实现jsonp

    JavaScript中模拟实现jsonp,需要遵循以下步骤: 1. 创建一个script标签 在DOM中创建一个script标签,并设置其src属性为需要跨域请求的URL,同时还需要设置一个callback参数,作为后端接口返回数据的回调函数名。 const script = document.createElement(‘script’); script.…

    JavaScript 2023年5月27日
    00
  • JS遍历DOM文档树的方法实例详解

    下面是关于“JS遍历DOM文档树的方法实例详解”的完整攻略。 标题 JS遍历DOM文档树的方法实例详解 简介 在编写JavaScript代码时,遍历DOM文档树是非常常见的操作。例如,查找某个元素、对所有子元素进行操作等等。本文将介绍以下5个遍历DOM文档树的方法: getElementById getElementsByTagName getElement…

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