1.防抖

防抖的原理就是:你尽管触发事件,但是我一定在事件触发 n 秒后才执行,如果你在一个事件触发的 n 秒内又触发了这个事件,那我就以新的事件的时间为准,n 秒后才执行,总之,就是要等你触发完事件 n 秒内不再触发事件,我才执行

参数说明:
1.fn:需要执行防抖的函数
2.wait:等待的时间间隔
3.immdiate:立刻执行函数,然后等到停止触发n秒后,才可以重新触发执行。如果频繁点击触发事件,会从新计算wait时间,直到不触发事件达到wait时长后才可以重新触发

  1. function debounce(fn,wait,immdiate) {
  2. let timeout,result,callnow
  3. return function() {
  4. let context = this
  5. let args = arguments
  6. if(timeout) {
  7. clearTimeout(timeout)
  8. }
  9. if(immdiate) {
  10. callnow = !timeout
  11. timeout = setTimeout(function(){
  12. timeout = null
  13. },wait)
  14. if(callnow) {
  15. result = fn.apply(context,args)
  16. }
  17. }else {
  18. timeout = setTimeout(function(){
  19. result = fn.apply(context,args)
  20. },wait)
  21. }
  22. return result
  23. }
  24. }

2.节流

节流的原理是:如果持续触发一个事件,每隔一段事件只执行一次事件,目的是为了降低事件触发的次数,按照事先定义的周期去执行.

  1. function throttle(fn,wait) {
  2. let context,args
  3. let previous = 0
  4. return function() {
  5. let now += new Date()
  6. context = this
  7. args = arguments
  8. if(now - previous >wait) {
  9. fn.apply(context,args)
  10. previous = now
  11. }
  12. }
  13. }