如何在面试中手写出javascript节流和防抖函数


Posted in Javascript onOctober 22, 2020

面试的时候我们经常会问别人是理解什么是节流和防抖,严格的可能要求你写出节流和防抖函数,这里我们抛开loadsh工具库手写节流和防抖

1.节流函数throttle

// 节流方案1,每delay的时间执行一次,通过开关控制
function throttle(fn, delay, ctx) {
  let isAvail = true
  return function () {
    let args = arguments // 开关打开时,执行任务 
    if (isAvail) {
      fn.apply(ctx, args)
      isAvail = false // delay时间之后,任务开关打开 
      setTimeout(function () { isAvail = true }, delay)
    }
  }
}
// 节流方案2,通过计算开始和结束时间
function throttle(fn,delay){
      // 记录上一次函数出发的时间
      var lastTime = 0
      return function(){
      // 记录当前函数触发的时间
      var nowTime = new Date().getTime()
      // 当当前时间减去上一次执行时间大于这个指定间隔时间才让他触发这个函数
      if(nowTime - lastTime > delay){
        // 绑定this指向
        fn.call(this)
        //同步时间
        lastTime = nowTime
      }
      }
    }

2.防抖debounceTail

2.1)只执行首次

// 防抖 且首次执行
// 采用原理:第一操作触发,连续操作时,最后一次操作打开任务开关(并非执行任务),任务将在下一次操作时触发)
function debounceStart(fn, delay, ctx) {
  let immediate = true 
  let movement = null
  return function() {
    let args = arguments
    
    // 开关打开时,执行任务
    if (immediate) {
      fn.apply(ctx, args)
      immediate = false
    }
    // 清空上一次操作
    clearTimeout(movement)
    
    // 任务开关打开
    movement = setTimeout(function() {
      immediate = true
    }, delay)
  }
}

2.2)只执行最后一次

// 防抖 尾部执行
// 采用原理:连续操作时,上次设置的setTimeout被clear掉
function debounceTail(fn, delay, ctx) {
  let movement = null
  return function() {
    let args = arguments
    
    // 清空上一次操作
    clearTimeout(movement)
    
    // delay时间之后,任务执行
    movement = setTimeout(function() {
      fn.apply(ctx, args)
    }, delay)
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中this详解
Sep 01 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
Aug 11 Javascript
原生JS实现图片轮播与淡入效果的简单实例
Aug 21 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
Mar 15 Javascript
easyui-datagrid开发实践(总结)
Aug 02 Javascript
vuex进阶知识点巩固
May 20 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
零基础之Node.js搭建API服务器的详解
Mar 08 Javascript
13 个npm 快速开发技巧(推荐)
Jul 04 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 Javascript
Vue.js的模板语法详解
Feb 16 Javascript
原生JS实现记忆翻牌游戏
Jul 31 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 #Javascript
微信小程序canvas动态时钟
Oct 22 #Javascript
vue-cli —— 如何局部修改Element样式
Oct 22 #Javascript
微信小程序入门之绘制时钟
Oct 22 #Javascript
微信小程序入门之指南针
Oct 22 #Javascript
微信小程序实现拼图小游戏
Oct 22 #Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 #Javascript
You might like
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
超简单使用Python换脸实例
2019/03/27 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
电子商务网站的创业计划书
2014/01/05 职场文书
大学军训感言300字
2014/03/09 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
解除施工合同协议书
2014/10/17 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
航班延误投诉信
2015/07/02 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python