首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

前端性能优化之防抖与节流,大幅度降低你的事件处理性能

timer, 当我们在网页第一次滚动页面时,触发scroll 事件, 首先判断 timer 是否有定时器, 因为第一次滚动触发事件,并没有定时器赋值给timer, 所以执行下面的代码, 这时给 timer...同样的先判断 timer 是否有定时器, 因为上一次触发该事件给 timer 赋值了一个定时器, 但此时定时器还没结束, 所以 timer 是有定时器的,所以执行 if 语句里的代码, 将 timer...那么,节流就是, 我们滚动页面,获取了一下导航栏离文档顶部的距离, 此时我们一直在滚动页面, 只不过我们刚获取过距离了,就先不获取了, 等距离上一次获取几秒,我们再获取一次吧。...就这样一直频繁触发滚动事件,按照步骤2循环往复…… 直到距离上次操作超过1秒, now - last 大于1秒,才会再一次获取导航栏离文档顶部的距离,并又一次给 last 赋值一个操作结束时的时间戳...,if 判断 status为 true , 表示上一次定时器还在执行呢,所以就不做任何操作 就这样一直触发滚动事件,按照步骤2往复循环…… 直到刚开始的定时器执行完毕以后,给 status赋值一个 false

1.5K20

谈谈js中的函数节流

写在前面 几天没有更新博客了,最近也没什么可忙的,今天我们说说js函数中常见的性能优化中的一个方式-函数节流! 首先明白一点,但凡涉及到性能优化的,基本都不是什么技术难点,为什么这么说呢?...说一下函数节流的原理,其实很简单,就是我们写一段代码的时候,规定他在一定时间内不准连续执行, 第一次调用函数的时候,创建一个定时器执行函数以后重置定时器,同时清除之前的定时器,那么每次其实我们的定时器都是最新的...,所以第一次执行的, if(!...//这里我们设置一个时间,在函数每次执行以后的一秒将控制器的状态改为可执行 setTimeout(function(){ lock = true; },1000); }...,settimeout是在规定时间执行一次,还是有很大区别的,这个看自己的需求!

63930

「前端小知识」如何用setInterval定时执行有限次数?

又或者,你希望在用户登录显示一个限时优惠的提示,每隔几秒钟提醒用户一次,但不能一直提醒下去。这时候,如何优雅地实现这样的需求呢? 什么是setInterval?...我们来看看如何让setInterval在执行固定次数自动停止。...设置定时器:使用 setInterval 函数,每隔200毫秒执行一次回调函数。 增加计数:在回调函数中,通过 ++count 增加计数器的值。...通过这种方式,我们成功实现了定时器执行5次,然后自动停止。这样,你就能满足那些只需重复执行有限次数的需求了。 实际应用 数据刷新:每隔一段时间自动刷新页面上的数据,但只刷新5次,避免服务器过载。...用户提醒:在用户登录,每隔几秒钟提醒一次限时优惠信息,但只提醒几次,防止用户反感。 动画效果:执行一个重复的动画效果,但只重复固定次数,提升用户体验。

14810

【Vue技巧之】生产部署自动更新提示

Part 1 说下思路和效果 思路其实很简单,就是我们可以在build的index.html页面上,设置一个参数,也可以直接使用js文件的文件指纹参数,这里的文件指纹,其实就是编译的文件的一个后缀,...下次build的指纹肯定和上次的不一样: 我今天用一个参数来举例,比如说一个version...=xx,然后写一个定时器,每隔几秒或者这个参数,只要发生了变化,就提示用户刷新页面,大概效果是这样的: 大概思路就是这样,只要build完成,手动修改或者自动获取下index.html的某个参数的值是否变化...; }); } function checkVersion() { let currentVersion; // 当前页面的版本号 // 初始化时获取一次版本号...fetchVersion().then(version => { currentVersion = version; }); // 创建定时器,每10秒检查一次

30910

带你详细了解 Node.js 中的事件循环

timers(定时器阶段) 首先事件循环进入定时器阶段,该阶段包含两个 API setTimeout(cb, ms)、setInterval(cb, ms) 前一个是仅执行一次一个是重复执行。...例如,下例我们设置了一个定时器函数,并预期在 1000 毫秒执行。...3000ms,当完成这些同步操作,进入一次事件循环,首先检查定时器阶段是否有到期的任务,定时器的脚本是按照 delay 时间升序存储在堆内存中,首先取出超时时间最小的定时器函数做检查,如果 **nowTime...再运行 client.js 看下事件循环的执行过程: 首先程序调用了一个在 1000ms 超时的定时器。...当大约过了 1000ms ,进入下一次事件循环进入定时器执行到期的定时器回调函数,我们会看到日志 setTimeout run after 1003 ms。

2.1K30

为什么要用 setTimeout 模拟 setInterval ?

下面我们一一罗列.. ## 推入任务队列的时间不准确 定时器代码: ```js setInterval(fn(), N); ``` 上面这句代码的意思其实是**fn()将会在 N 秒之后被推入任务队列...这样一来,花的时间就比较长,有可能前一次代码还没有执行完,一次代码就被添加到队列了。也会到时定时器变得不准确,甚至出现同一时间执行两次的情况。...```js // 做一个网络轮询,每一秒查询一次数据。...添加 T1 定时器代码至队列中,主线程中还有任务在执行,所以等待,some event 执行结束执行 T1 定时器代码;又过了 100ms,T2 定时器被添加到队列中,主线程还在执行 T1 代码,所以等待...;又过了 100ms,理论上又要往队列里推一个定时器代码,**但由于此时 T2 还在队列中,所以 T3 不会被添加(T3 被跳过)**,结果就是此时被跳过;这里我们可以看到,T1 定时器执行结束马上执行

1.2K40

VUE2.0 学习(五)一篇文章读懂监听属性watch,他的两种写法,以及深度监视和简写方式

/js/vue.js"> .div1{ width: 100px; height: 50px;...就是我们不需要点击某一个按钮进行变化了,现在是只要data里面的数据变化,那么就可以执行一定的逻辑 使用的场景: 当一个data数据变化之后,我们可以拿到变化之前的数据和变化之后的数据,进行对比之后进行后续的操作...也就是在watch这个属性里面的和data同名的配置里面,有很多的属性 第一个是handler handler 只要data里面的变量变化,就会执行这个里面的逻辑 immediate deep...比如数据变化之后,等几秒才有操作,那么只能使用监听属性 总结 为什么vue项目里面的定时器,一般写成箭头函数,其他的写成普通函数 是浏览器调用定时器函数,如果写成普通函数,那么这个定时器里面是有this...所以,vue项目里面的定时器,一般写成箭头函数,其他的写成普通函数

1.3K20

【JavaScript】案例2:轮播图

知识讲解-JavaScript(二) 2.1 定时器 2.1.1 循环定时器的设置和取消 2.1.2 一次定时器的设置和取消 2.2 js 事件-onload 3. 需求分析 4. ...知识讲解-JavaScript(二) 2.1 定时器 2.1.1 循环定时器的设置和取消 2.1.1.1 启动循环定时器-setInterval() 循环定时器,调用一次就会创建并循环执行一个定时器...我们可以通过 clearInterval 方法,指定某个循环定时器 停止 格式: clearInterval( 定时器 ID); 示例: 效果: 因为定时器设定立即取消了...,所以没有任何效果 2.1.2 一次定时器的设置和取消 2.1.2.1  启动一次定时器 -setTimeout() 一次定时器,调用一次就会创建并执行一个定时器一次。...我们可以通过 clearTimeout 方法,指定某个一次定时器 停止 格式: clearTimeout ( 定时器 ID); 示例: 效果: 因为定时器设定立即取消了

50230

【JavaScript基础】Js定时器(你想看的原理也在哟)

Js定时器,是前端的基本工具,在日常的开发和工作上也会经常的使用到。前端的定时器有两种,一种是一次定时器,一种是重复性定时器。...一次定时器setTimeout 标准:在指定的毫秒数调用函数或计算表达式。 口语:使一段代码在指定时间运行。...因此实际上,两次执行之间的间隔会小于指定的时间。 比如,setInterval指定每100ms执行一次,每次执行需要5ms,那么第一次执行结束95毫秒,第二次执行就会开始。...如果某次执行耗时特别长,比如需要105毫秒,那么它结束,下一次执行就会立即开始。...为了确保两次执行之间有固定的间隔,可以不用setInterval,而是每次执行结束,使用setTimeout指定下一次执行的具体时间。

69430

JS手撕(三) 节流、防抖

JS手撕(三)    节流、防抖 节流和防抖 前端开发中会遇到一些频繁的事件触发,像是resize、scroll、mousedown、mousemove、keyup、keydown等。...节流(throttle) 节流就是函数执行一次,经过一定间隔才能执行第二次。 实现思路:定义一个定时器,当定时器到点时,清除之前的计时器,清除定时器才可以再次执行函数。...防抖(debounce) 防抖就是在规定时间内,只让最后一次生效,前面的不生效。 所以简单来说的话,节流和防抖的区别就是:节流是第一次有效,防抖是最后一次有效。...实现原理也和节流很像:定义一个定时器,返回一个函数,每次执行返回的函数都会先清除定时器,然后设置定时器,该定时器的回调就是执行传入的函数。先清除定时器就是为了实现让最后一次生效,前面的不生效的关键。...参考 死磕 36 个 JS 手写题(搞懂,提升真的大) - 掘金 GitHub - qianlongo/fe-handwriting: 手写各种js Promise、apply、call、bind、new

86640

节流函数和防抖函数的注意事项

秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 思路 每次触发事件时都取消之前的延时调用方法 html代码: ?...var test = document.getElementById('test'); test.onclick=debounce(sayHi); // 防抖 节流 高频事件触发,但在n秒内只会执行一次...,所以节流会稀释函数的执行频率 思路: 每次触发事件时都判断当前是否有等待执行的延时函数 html如防抖 js代码: function throttle(fn) { let canRun =...setTimeout中 fn.apply(this, arguments); // 最后在setTimeout执行完毕再把标记设置为true(关键)表示可以执行一次循环了...明明是按照标准写的呀,只是换了事件绑定方式,为啥没有效果,后来反复验证发现, 发现了问题所在: 原来是html中的debounce(sayHi)()事件每次点击都会运行一次,导致每次的储存定时器id的timeout

72030

从一个超时程序的设计聊聊定时器的方方面面

这个逻辑,简单一点可以使用JS定时器实现,每隔1秒钟检查一次剩余时间,时间到了终止计时给出提示,时间不到就更新计时界面。...在代码1中,我们设定定时器每隔1秒触发一次,但在实际的运行过程中,无法保证每隔1秒执行一次。如果间隔时间无法保证,例如延后了,那么总执行时间就要长于允许的总时间。...间隔定时器的触发,是由主线程之外的线程管理高度的,时间到了,就塞到主线程里执行,并不管上一次的代码有没有执行完。...顾名思义,立即定时器即是立即执行。但在JS引擎中,没有立即执行,所以这里的立即执行,即是在下一代中执行。...,但在它的执行过程中,定时器不会触发(JS是单线程);并且在它之后,也不会输出3个2。

1.4K20

简单说 JavaScript实现雪花飘落效果

setInterval() setInterval函数的用法与setTimeout完全一致,区别仅仅在于setInterval指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行。...主要是以下4步: 1、定义一片雪花模板; 2、设置第一个定时器,周期性定时器,每隔一段时间生成一片雪花; 3、设置第二个定时器一次定时器,当第一个定时器生成雪花,并在页面上渲染出来,修改雪花的样式...,一次定时器, //当第一个定时器生成雪花,并在页面上渲染出来,修改雪花的样式,让雪花动起来; setTimeout(function...,会在下一次Event Loop执行,所以第二个定时器的作用是为了让生成的雪花先拼接到页面中渲染出来,再修改他的样式,这样才能让他动起来,如果没有这个定时器,浏览器会把所有的JS代码都执行完之后才渲染页面...简单说,意思就是用了这个定时器,能把两次修改样式的代码分开执行,可以先把第一次修改的样式渲染,在进行第二次的修改,雪花就会动了。 JQuery版 <!

2.1K50
领券