美文网首页
通过防抖功能对js闭包的理解

通过防抖功能对js闭包的理解

作者: 掉毛蛙 | 来源:发表于2021-05-09 13:57 被阅读0次

以前一直对js的闭包不是很理解,看了很多文章也理解不了,果然我是个辣鸡前端,直到最近在看防抖,网上很多防抖的方法都一样,现在以滚动为例子:

// 防抖
function debounce(f, wait) {    
    var timer = null;    
    return function() {        
        if(timer !== null)   clearTimeout(timer);        
        timer = setTimeout(f, wait);    
    }
}
// 滚动后处理函数
function handle() {    
    console.log('滚动后执行的代码逻辑' + Math.random()); 
}
// 绑定滚动事件
window.addEventListener('scroll', debounce(handle, 1000));

防抖的原理是:先设置一个定时器变量,用闭包保存,在事件触发的时候,清除定时器,然后再设置一个,那么如果页面一直滚动,刚刚建立的定时器就会被清除,直到最后不再滚动页面,就执行最后一次设置的定时器。

然后,之前一直不是很理解闭包的我更加不理解防抖原理,这是我的错误理解:每次滚动每次都调用了debounce,那定时器也被重新定义了,上一次的定时器怎么处理,怎么实现的上一次的定时器被清空,为什么为什么。。。。。

太难受了,又重新去看闭包的文章,醍醐灌顶!!!

滚动事件绑定的实际上是debounce函数return的那个匿名函数,就是个闭包,实现了对变量timer的静态化(每次调用都可以引用到之前的timer),和局部化(避免了对全局命名空间的污染),所以才能实现清空上次定时器防抖的功能。

那么闭包是怎么定义的,大多数就是一句话:有权访问另一个函数作用域内变量的函数都是闭包。举个栗子:

function test(){
  var count = 0;
  function counter(){
    count++; 
    console.log(count);
  }
  return counter;
}
var someCount = test();
someCount(); 
someCount(); 

这里打印出来的分别是1、2,
var someCount = test()这一句中,test()返回的是counter,可以这么理解someCount = counter;(只是这么理解,并不能这么用!)
那么someCount()相当于counter();( ()是执行函数的意思
所以,变量count并没有被清掉,每次调用返回的都是叠加后的值。

总结:上面提到过的,闭包实现了对变量的静态化和局部化

(个人理解,如有错误,感谢指正!)

相关文章

  • 通过防抖功能对js闭包的理解

    以前一直对js的闭包不是很理解,看了很多文章也理解不了,果然我是个辣鸡前端,直到最近在看防抖,网上很多防抖的方法都...

  • JS性能优化之——节流和防抖

    闭包 由于节流和防抖函数的实现都用到了闭包,所以在了解节流和防抖之前我先简单介绍下什么是闭包。 由于js代码在一个...

  • 面试总结之基础篇(1)

    深拷贝与浅拷贝 原型与原型链 防抖节流 this 指向 new关键字 深度剖析js闭包

  • 通过例子理解JS闭包

    理解闭包的前提是对JS变量作用域的熟悉,变量作用域包括全局变量和局部变量。 简要说明:函数内部能够访问全局变量,函...

  • 整理

    内容 浏览器渲染 执行上下文 js 事件循环机制 this 作用域 new 原型 原型链 防抖&节流 闭包 深浅拷...

  • 一分钟理解js闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 什么是闭包?几分钟告诉你

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

网友评论

      本文标题:通过防抖功能对js闭包的理解

      本文链接:https://www.haomeiwen.com/subject/loimdltx.html