当一个函数执行的时候,会有一个机制,给这个函数内部的所有变量都标上“我要进啦”,“开始啦”这种类似的标签。
当一个函数执行完毕之后,这个函数内部的所有不能再被访问到的变量都标上“离开了”,“这是垃圾了”。
最后垃圾收集器根据特定的时间或在算法不断的去看哪些变量被确定是垃圾了,然后把它们收集,这样就腾出更多内存来做其他操作。
这就是现在javascrip主流的垃圾收集机制 (标记清除)
函数内部哪些变量再执行完后还能被访问
如果理解闭包的话,就能理解在函数执行完之后内部的变量在什么时候还能被访问而不被标记为垃圾。
function a(){ //函数开始执行 //标记两个变量为进入状态 var i = 0; var x = 1; //不在return中存在的变量在执行之后会被标记为垃圾 x++; //return中的方法或函数内存在当前执行环境的变量的时候 //这个变量不会被标记为垃圾 return function() { i++; } }
上面这个例子简单的描述了垃圾收集的一个过程。