函数防抖

这是一个简单的函数防抖问题,和同事解释的是利用作用域链来存储内部匿名函数的变量,但问起为什么外部函数可以存储变量而不会被释放内存,我就去查了下浏览器的垃圾收集机制。


image.png
   常用的是引用计数清除和标记清除,由于引用计数存在循环引用问题(两个对象互相引用,无法清除),现在大多数浏览器才用的是标记清除,标记清除的核心是‘对象是否可以获得’,定期找所有从根(全局对象)开始引用的对象,然后找这些对象引用的对象 。。。从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。
 由于debounce返回的匿名函数被‘document.getElementById('input').oninput’引用,同时debounce又被匿名函数引用,所以debounce函数中的变量不会被垃圾回收机制清除。

最后发现,debounce函数和内部的匿名函数形成了一个明显的闭包(有权访问另一个函数作用域中的变量的函数),这就解释了为什么要慎重使用闭包。因为闭包会占用过多的内存,并且需要手动清除。

你可能感兴趣的:(函数防抖)