Open frankfu360 opened 5 years ago
什么是内存泄漏: 好,我相信你看到这里应该明白回收变量(这个词在js里其实就等价于销毁内存)是什么个意思了,那这和我们今天主题“闭包”有什么关系?别急,看代码,我给你在例子1上做点小改动,你就看明白了!
(function (){
var a = 10;
add.onclick = function (){
a++;
span.innerHTML = a;
}
})()
我在例子1的外面加了自执行匿名函数包裹了一下,现在你就可以把这段操作看成是函数包裹函数的形式了,放心,代码一样能跑!现在我们把外面的匿名函数成为father函数,把里面点击按钮的函数称为child函数,没毛病吧!毕竟包裹关系,好,现在我就可以说,这就是个闭包环境了,为什么?因为child函数引用了father函数的变量a啊!闭包的最大特性就是,如果里函数引用(or访问,这俩词在这个语境下是等价的)了外函数的某个变量,那这个变量就能享受和全局变量一样的特权,丫不会被回收!除非你关闭页面or浏览器!这也就是为什么a能一直++并正常显示的问题了,因为他被child函数一直访问着,不会被销毁!不会被销毁!不会被销毁!重要的事情说三遍!闭包就这个作用! 好的,那顺着思路继续走,那内存泄漏是什么鬼?很简单,如果你像这种享受全局变量不会被销毁的特权的闭包变量多到一定数量了,那内存就要撑爆了,毕竟咱的电脑对待浏览器是很抠门的,内存就分配给你那么点,一多就会爆,这就是内存泄漏,并不是什么高大上的概念! https://juejin.im/post/5b1f36e6f265da6e1a603e34
闭包的应用场景: 在 web 编程时,你使用闭包的场景可能会很多。大部分前端 JavaScript 代码都是“事件驱动”的:我们定义行为,然后把它关联到某个用户事件上(点击或者按键)。我们的代码通常会作为一个回调(事件触发时调用的函数)绑定到事件上。
https://juejin.im/entry/58f424d5570c3500563d7541