如何在面试中手写出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 相关文章推荐
JQUBar 基于JQUERY的柱状图插件
Nov 23 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
JS.findElementById()使用介绍
Sep 21 Javascript
随鼠标上下滚动的jquery代码
Dec 05 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
jQuery中Form相关知识汇总
Jan 06 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
微信小程序本作用域下调用全局JS详解及实例
Feb 22 Javascript
es6在react中的应用代码解析
Nov 08 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
Jan 09 Javascript
JavaScript, select标签元素左右移动功能实现
May 14 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
php+dbfile开发小型留言本
2006/10/09 PHP
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
JavaScript中string对象
2015/06/12 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
全面解读Python Web开发框架Django
2014/06/30 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
python读取LMDB中图像的方法
2018/07/02 Python
python 实现敏感词过滤的方法
2019/01/21 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Python函数式编程实例详解
2020/01/17 Python
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
行政助理岗位职责范文
2013/12/03 职场文书
现金出纳岗位职责
2014/03/15 职场文书
个人校本研修方案
2014/05/26 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
党员先进事迹材料
2014/12/19 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
推广普通话主题班会
2015/08/17 职场文书