1、闭包的应用:防抖和节流
1.1、防抖(debounce):
当连续触发使事件时,一段时间内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前又一次触发事件,就重新开始延时 可以理解为“回城”,回城固定时间是8秒,要是在这个过程中有人打断你,你就要重新开始回城 步骤: 1、我们首先需要触发事件(当页面中的事件触发时,就会触发addEventListener里面的函数) 2、这时我们便重置计时单位,然后开始计时 3、如果在一定时间范围了没有再次触发,便执行函数 4、如果在一定范围内有再次触发,便再次重置计时单位,再次开始计时 防抖函数实例如下
< script>
const btn = document. querySelector ( 'button' )
function pay ( ) {
console. log ( '触发' ) ;
}
function myDebounce ( fun, delay ) {
if ( typeof fun !== 'function' ) {
console. error ( 'type error' ) ;
return
}
let timer
return function ( ) {
let context = this
let args = arguments
clearTimeout ( timer)
timer = setTimeout ( function ( ) {
fun . apply ( context, args)
} , delay)
}
}
btn. addEventListener ( 'click' , myDebounce ( pay, 500 ) )
</ script>
1.2、节流(throttle)
当持续触发事件时,保证一定时间内只调用一次事件处理函数。 可以理解为技能的CD,比如吕布一技能的cd是5秒,就算持续按一技能,吕布也只能每隔5秒释放一次一技能。 步骤: 1、触发事件的时候马上执行任务,然后设定时间间隔限制 2、在这段时间内无论用于怎么触发事件,都忽略操作 3、在时间到了以后,如果用户再次触发事件,便子啊此执行任务,然后设置时间间隔 两种方法 (1)、定时器
< script>
const btn = document. querySelector ( 'button' )
function pay ( ) {
console. log ( '已剁手' ) ;
}
function myThrottle ( fun, delay ) {
if ( typeof fun !== 'function' ) {
console. error ( 'type error' ) ;
return
}
let timer
return function ( ) {
let context = this
let args = arguments
if ( timer) {
return
}
timer = setTimeout ( function ( ) {
fun ( ) . apply ( this , args)
timer = null
} , delay)
}
}
btn. addEventListener ( 'click' , myThrottle ( pay, 500 ) )
</ script>
< script>
const btn = document. querySelector ( 'button' )
function pay ( ) {
console. log ( '已剁手' ) ;
}
function myThrottle ( fun, delay ) {
if ( typeof fun !== 'function' ) {
console. error ( 'type error' ) ;
return
}
let pre = 0 ;
return function ( ) {
let context = this
let args = arguments
let now = new Date ( )
if ( now - pre >= delay) {
fun . apply ( context, args)
pre = now
}
}
}
btn. addEventListener ( 'click' , myThrottle ( pay, 500 ) )
</ script>