notes
  • Introduction
  • 语言
    • JS
      • JS原型到原型链
      • JS继承的实现
      • this对象
      • Promise基本概念
      • Promise实现
      • Promise实战
      • JS的EventLoop
      • JS容易出现误区的运算符
      • JS容易出现误区的操作符
      • JS深拷贝
      • JS节流与防抖
      • ES5实现原生/ES6方法
    • TS
      • 声明文件
      • 项目配置
    • CSS
      • CSS引入方式以及优先级计算
      • BFC神奇背后的原理-文摘
      • 回流reflow与重绘repaint
      • 三栏式布局
      • 垂直居中
      • 清除浮动的方法
      • 移动端适配方案
      • 纯CSS斜切角实现
      • CSS揭秘
      • 背景图片轮播
      • CSS绘制序列帧动画
      • transform实现一个多面体
    • HTML
  • ES6
  • Node.js
    • xxx
  • 前端框架
    • Vue.js
      • Vue双向数据绑定原理
      • Vue-Router原理及实现
    • React
    • AngularJS
  • 工程构建
    • Webpack
      • 01-webpack概述及背景
      • 03-webpack热更新原理
      • 04-splitChunks原理分析
      • 05-webpack工作流程
      • 07-webpack构建流程
      • 07-webpack构建流程
      • 10-webpack 如何进行性能分析
    • Gulp
    • Lint
      • ESLint
      • TSLint
    • Bable
  • 工程化
    • 模块化
    • 组件化
    • 规范化
      • 编码规范
    • 自动化
  • 运维
    • Nginx
    • GIT
    • CDN
    • VPS
    • DBA
  • 小程序
  • 跨端
  • 测试
  • 计算机技术
    • 计算机网络
      • 同源策略到前端跨域解决方案
      • TCP数据传输
      • TCP和UDP的区别
      • HTTP协议概述
      • HTTP缓存详解
      • HTTPS以及SSL建立过程
      • HTTPS的七个误解(译文)
      • cookie与Session机制区别以及Cookie SessionStorage LocalStorage异同
      • HTTP状态码Status
      • DNS原理入门
      • 网络攻击与防御
      • HTTP转发与重定向
      • 登录认证设计
    • 操作系统
      • shell脚本命令
    • Linux
      • Linux命令大全
      • vim命令
    • 浏览器
      • 浏览器内核、JS 引擎、页面呈现原理及其优化
      • 九种浏览器端缓存机制概览
      • 性能优化-网络请求方面
      • webkit解析CSS过程详解
  • 前端面试
    • 算法
Powered by GitBook
On this page
  • 节流
  • 防抖
  1. 语言
  2. JS

JS节流与防抖

JS节流和防抖是说的非常多一个话题,不论什么时候,

不然会来带很多性能问题。

节流

实现函数节流throttle的方法一般有两种:

  • 定时器setTimeOut

  • 时间戳new Date()

定时器方式

function throttle(fn, time) {
  let timer;
  return function(){
    const args = arguments;
    const _that = this;
    if(timer) {
      return;
    } 
    timer = setTimeOut(() => {
      fn.call(_that, args);
      timer = null;
    }, time);
  }
}

或者两者组合起来使用,更加精确

定时器+时间戳方法

// 简单的节流函数 wait的延时保证程序的健壮性
function throttle (func, mustRun, wait) {
  let timeout,
  startTime = new Date().getTime();
  return function () {
    let that = this,  
      args = arguments,
      curTime = new Date().getTime();
    clearTimeout(timeout);
    // 如果达到了时间间隔,触发 handler
    // 如果没有,设置一个延时,假设为最后一次
    if (curTime - startTime >= mustRun) {
      func.apply(that, args);
      startTime = curTime;
    } else {
      // 没达到触发间隔,重新设定定时器 ,
      // 保证不丢失最后一次触发,如果中间再触发,会在之前被clear掉
      timeout = setTimeout(func, wait);
    }
  };
}

测试

let timer1 = setInterval(throttle(fn, 500), 10); // 每500ms执行一次

防抖

当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

function debounce(fn, wait) {
  var timer = null;
  return function () {
    var context = this
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args)
    }, wait);
  }
}

测试:设置一个定时器,每10ms执行一次,1s后关闭。 debounce防抖时间设置为500ms,则函数应该在1.5s后执行

console.time('debounce')
let fn = function () {
  console.timeEnd('debounce', ‘’)
}

let timer1 = setInterval(debounce(fn, 500, true), 10);
let timer2 = setTimeout(() => { clearInterval(timer1) }, 1000);
// 函数被执行
// debounce: 1512.098ms
PreviousJS深拷贝NextES5实现原生/ES6方法

Last updated 3 years ago