垃圾回收机制
如果一个对象不再被引用,那么这个对象就会被垃圾回收机制回收;
如果两个对象互相引用,且不被第三个对象所引用,那么这两个互相引用的对象也会被回收。
(注:在闭包中,父函数被子函数引用,子函数又被外部函数的变量引用,这就是父函数不被回收的原因)
垃圾回收机制通常有两种方法:
1、标记清除
在一个函数中设置一个变量,就将这个变量标记为‘进入环境’,从逻辑上来说,永远不会释放进入环境所占得内存(因为只要执行流进入相应的环境,就会被用到)。而当变量离开环境时,就会被标记‘离开环境’;
垃圾回收机制就是在运行的时候 会给存储在内存中的所有变量都加上标记,然后,它会去掉处于在环境中的变量以及被环境中的变量引用的变量标记(闭包);在此之后 剩下的带有标记的变量都是被视为 准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
2、引用计数
引用次数为0就表示 这个值不再被用到了,因为可以将这块内存释放
闭包
闭包就是有权限访问其他函数作用域的局部变量的一个函数
在js中,变量的作用域属于函数作用域,在函数执行后作用域就会被清除,内存叶随之被收回,但是 由于闭包是建立在一个函数内部的子函数,由于其可访问上级作用域的原因,即使上级函数执行完毕,作用域叶不会随之销毁,这是的子函数----也就是闭包,便拥有了访问上级作用域中变量的权限,即使上级函数执行完毕,作用域内的值也不会被销毁。
可以这样理解:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
变量不受外界影响原因:
形成了私有作用域,让私有变量存到内存中,保护私有变量,让他 不受外界影响(外层函数的调用结果是返回内层函数,即内层函数自治性或者外层函数作用域内设置返回值为内层函数,这个内存函数就形成闭包,调用外层函数的变量)