防抖(debounce)函数的作用是什么?有哪些应用场景,请实现一个防抖函数

  • 防抖函数的作用

防抖函数的作用就是控制函数在一定时间内的执行次数。防抖意味着N秒内函数只会被执行一次,如果N秒内再次被触发,则重新计算延迟时间。

举例说明:小思最近在减肥,但是她非常贪吃。为此,与其男朋友约定好,如果10天不吃零食,就可以购买一个包(不要问为什么是包,因为包治百病)。但是如果中间吃了一次零食,那么就要重新计算时间,直到小思坚持10天没有吃零食,才能购买一个包。所以,管不住嘴的小思,没有机会买包(悲伤的故事)...这就是防抖

不管吃没吃零食,每10天买一个包,中间想买包,忍着,等到第十天的时候再买,这种情况是节流。如何控制女朋友的消费,各位攻城狮们,get到了吗?防抖可比节流有效多了!

  • 防抖应用场景
  1. 搜索框输入查询,如果用户一直在输入中,没有必要不停地调用去请求服务端接口,等用户停止输入的时候,再调用,设置一个合适的时间间隔,有效减轻服务端压力。
  2. 表单验证
  3. 按钮提交事件。
  4. 浏览器窗口缩放,resize事件等。
  • 防抖函数实现
  1. 事件第一次触发时,timernull,调用 later(),若 immediatetrue,那么立即调用 func.apply(this, params);如果 immediatefalse,那么过 wait 之后,调用 func.apply(this, params)
  2. 事件第二次触发时,如果 timer 已经重置为 null(即 setTimeout 的倒计时结束),那么流程与第一次触发时一样,若 timer 不为 null(即 setTimeout 的倒计时未结束),那么清空定时器,重新开始计时。
function debounce(func, wait, immediate = true) {let timer;// 延迟执行函数const later = (context, args) => setTimeout(() => {timer = null;// 倒计时结束if (!immediate) {func.apply(context, args);//执行回调context = args = null;}}, wait);let debounced = function (...params) {let context = this;let args = params;if (!timer) {timer = later(context, args);if (immediate) {//立即执行func.apply(context, args);}} else {clearTimeout(timer);//函数在每个等待时延的结束被调用timer = later(context, args);}}debounced.cancel = function () {clearTimeout(timer);timer = null;};return debounced;
};

immediate 为 true 时,表示函数在每个等待时延的开始被调用。

immediate 为 false 时,表示函数在每个等待时延的结束被调用。

原创链接地址 :防抖(debounce)函数

节流(throttle)函数的作用是什么?有哪些应用场景,请实现一个节流函数

  • 节流函数的作用

节流函数的作用是规定一个单位时间,在这个单位时间内最多只能触发一次函数执行,如果这个单位时间内多次触发函数,只能有一次生效。

举例说明:小明的妈妈和小明约定好,如果小明在周考中取得满分,那么当月可以带他去游乐场玩,但是一个月最多只能去一次。

这其实就是一个节流的例子,在一个月的时间内,去游乐场最多只能触发一次。即使这个时间周期内,小明取得多次满分。

  • 节流应用场景
  1. 按钮点击事件
  2. 拖拽事件
  3. onScoll
  4. 计算鼠标移动的距离(mousemove)
/*** 定时器版* @param {Function} fn 需要执行的函数* @param {Number} delay 触发时间间隔*/
function throttle (fn, wait) {let timeout = nullreturn function () {let context = this,args = argumentsif (!timeout) {timeout = setTimeout(() => {timeout = nullfn.call(context, args)}, wait)}}
}/***时间戳版* @param {Function} fn 需要执行的函数* @param {Number} wait 触发时间间隔*/
function throttle (fn, wait) {let pre = 0return function () {let now = Date.now(),context = this,args = argumentsif (now - pre > wait) {fn.call(context, args)pre = now}}
}

var、let、const区别

声明方式 变量提升 暂时性死区 重复声明 块作用域有效 初始值 重新赋值
var 不存在 允许 不是 不必须 允许
let 不会 存在 不允许 不必须 允许
const 不会 存在 不允许 必须 不允许

作用域中声明了let变量,但是let变量的使用却在声明之前,这通常叫做变量提升。
但是let并不像var一样,var变量声明前使用,会打印出undefined.但是let变量直到被赋值才会被初始化。
在变量被初始化前访问这个变量会报reference error.我们称这个变量在作用域开始到被初始化之间为暂时性死区。

  1. var存在变量提升,let,const都不存在变量提升 
  2. 暂时性死区
  3. 在相同作用域中,let 和 const 不允许重复声明变量,var允许重复声明变量
  4. const声明变量时必须设置初始值
  5. const声明一个只读常量,这个常量不可改变
  6. let/const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。

用var声明for循环变量:

用let声明for循环变量::

我们说 let 声明的变量仅在块级作用域内有效,变量i是let声明的,当前的 i 只在本轮循环有效,所以每一次循环的 i 其实都是一个新的变量。

面试典籍(整理于6.24-6.30)相关推荐

  1. iOS开发面试知识整理 – OC基础 (二)

    iOS | 面试知识整理 – OC基础 (二) 1.C和 OC 如何混编 xcode可以识别一下几种扩展名文件: .m文件,可以编写 OC语言 和 C 语言代码 .cpp: 只能识别C++ 或者C语言 ...

  2. 面试问题整理之操作系统和代码相关问题

    本文为操作系统以及C/C++相关面试问题整理.持续更新的更多更详细攻略可见这里,欢迎点星点关注 1.引用和多态的区别? 引用是除指针外另一个可以产生多态效果的手段.这意味着,一个基类的引用可以指向它的 ...

  3. Android面试资料整理

    文章目录 前言 面试问题整理 Android 问题 一.Activity 1.Activity 的生命周期 2.onStart()和onResume().onPause()和onStop()的区别? ...

  4. *Java软件开发面试知识整理*

    Java软件开发面试知识整理 围绕以下几点回答问题:是什么.为什么.什么时候用.项目实现.解决什么问题.遇到的困难 谈谈你对Java和C的理解? Java: 面向对象.Unicode:可以跨平台(JV ...

  5. 【面试题】某司社招面试题目整理及答案

    某司社招面试题目整理及答案 Java基础部分 HashMap的实现原理 如何解决Hash碰撞 HashMap的存储(hash算法.hash冲突.初始化.扩容) HashMap和HashTable的区别 ...

  6. 前端面试知识点整理——网络

    前端面试知识点整理--网络 文章目录 一. 进程(process)和线程(thread) 二. 浏览器属于一种多进程的架构 三.CRP,关键渲染路径(critical rendering path) ...

  7. 【面试】网易游戏面试题目整理及答案(5)

    网易游戏面试题目整理及答案(5) 算法 操作系统 Linux部分 其他 参考资料 算法 Leetcode 75题:请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 1)每一行 ...

  8. Python 面试中可能会被问到的30个问题

    第一家公司问的题目 1 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译.这样解释型语言每执行一次 ...

  9. 后端在插入数据发现重复如何正确的弹出警告_前百度面试官整理的——Java后端面试题(一)...

    List 和 Set 的区别 List , Set 都是继承自 Collection 接口 List 特点:元素有放入顺序,元素可重复 , Set 特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉 ...

  10. [面试笔试整理1]:深度学习机器学习面试问题准备(必会)

    此系列三篇文章的原文链接 面试笔试整理1:深度学习机器学习面试问题准备(必会) 1.神经网络基础问题 (1)Backpropagation(要能推倒) 后向传播是在求解损失函数L对参数w求导时候用到的 ...

最新文章

  1. 微前端在美团外卖的实践
  2. redis增删改查封装
  3. 学习jQuery之旅--使用炫酷的jQuery插件
  4. nginx与apache详细性能对比
  5. win32 socket的一个简单的例子 控制台
  6. 【Java从入门到头秃专栏 4】语法篇(三) :字符串 数组
  7. 【计算机网络】TCP端口
  8. phphstudy运行不了网站_网站SEO优化之如何维护网站权重?
  9. GetTickCount() 函数的作用和用法(转)
  10. C# interview questions--- 国外大公司c#技术面试必看(总结贴一)
  11. mysql 去空格_MySQL基本命令操作
  12. 机会是留给有准备的人
  13. 使用Google的项目(源码)托管服务(转)
  14. windows串口控制linux,是这个linux的串口配置与windows相同
  15. 基于MUI框架的影视播放APP的设计与实现毕业设计论文参考【原查重5.1%】
  16. 黑客帝国屏幕保护源码
  17. Vue + Echarts 正态分布图,在线计算标准差,生成正态分布曲线
  18. 基于STM32 LCD屏实现的俄罗斯方块小游戏(20220522完成 第一个综合类项目)
  19. 利用python进行假设检验
  20. AddMvcCore,AddControllers,AddControllersWithViews,AddRazorPages的区别

热门文章

  1. 怎样把显示桌面图标放入任务栏?
  2. 5 步打造自己的资讯阅读平台
  3. SERVLET JSP篇-02 HTTP协议、Servlet原理
  4. Excel或者WPS导入数据出现重复报错
  5. 最新 unity 血条的另类制作-伤害减血加血自动回血
  6. Win10无法自动更新时间
  7. c++遍历文件夹下所有图片
  8. 太难了!2021计算机考研这么多大学专业课变化!
  9. 交易系统设计及其前景
  10. 笛卡尔与人工智能:“我思故我在”作为智能测试标准的可能性