什么是闭包
闭包是一种函数结构的统称,就是一群长相结构大差不差的函数群体就叫做闭包。那么它有啥特点呢?最大的特点就是儿子函数使用或者访问了祖宗函数的私有变量,这样的玩意就是闭包。
举个栗子,马爸爸家里有若干个亿,刚好你看中的最新款劳斯莱斯幻影还差点钱,你想合理且合法的花马爸爸的钱,怎么办?最简单粗暴的方法是你变成他儿子住进他家里去,这样你就拥有了他私人财产的支配权,闭包也是如此,内部函数就是你,外部函数就是马爸爸,外部函数的变量就是马爸爸的钱,这就是闭包。
官方来说,闭包可以使内层函数访问外层函数的私有变量,并同时保证被访问的外部变量不泄露至全局变量中,保证了变量的安全性,又因为变量被引用的原因,内部变量并没有像以前一样,函数调用后就销毁,反而延长了变量的生命周期。
举个例子:
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
什么是内存泄漏
先来一波内存泄漏的定义,其实说白了就是该内存空间使用完毕之后未回收。
了解什么是闭包后,就比较容易了解内存泄露了。而说到内存泄漏就要提垃圾回收机制。
js中,按照垃圾回收机制,程序执行完毕后,全局变量和被引用着的变量是无法被垃圾回收机制回收的,也就是说除非你手动释放内存,不然他们就一直在你的内存空间里,像上述例子中,result是全局变量,全局变量不知道什么时候又会被使用,故内存中会一直保持着本该销毁的变量n。
而内存溢出则是指内存中存在大量的内存泄漏状况,举个栗子,假如上例中的:
var result=f1();
在你的代码中超多,也就是有很多类似result的全局变量对一个函数内的变量进行引用,这时就会造成内存中存在大量本应该在函数执行完毕后就销毁却被无法销毁的局部变量,导致大量内存被占无法释放,如果不加以控制,依然增加此种行为的话,就会导致内存溢出。所谓内存溢出其实也就是内存不够用了占满了的意思。所以要注意闭包只是很容易有内存溢出的风险,并不是说闭包一定会导致内存溢出。
关于垃圾回收机机制,感兴趣的可以自己去看看,有个博主写的还挺有意思,但我找不到了。。。。。。
标签:闭包,函数,内存,全局变量,泄露,变量,result From: https://www.cnblogs.com/zsy1006/p/16421573.html