function fn1(){
var a=10
var b=20
var c=30
function fn2(){
alert(a++)
}
return fn2
}
var fn3=fn1()
fn3()
fn3()
以上代码,形成了闭包,垃圾回收机制不会回收a变量,但是没有用到的b,c两个变量会被垃圾回收机制回收吗?
function fn1(){
var a=10
var b=20
var c=30
function fn2(){
alert(a++)
}
return fn2
}
var fn3=fn1()
fn3()
fn3()
以上代码,形成了闭包,垃圾回收机制不会回收a变量,但是没有用到的b,c两个变量会被垃圾回收机制回收吗?
谢邀!说一点理论性吧。
内存垃圾回收其实说的就是对象间引用、引用、引用(重要说三遍)关系,不管是全局的亦或局部的,而内存的回不回收取决于对象是否被需要。
对象是否被需要在所有现代浏览器当中都使用一种叫标记清除垃圾回收算法(只是不同的浏览器实现的算法或对算法的优化不同,但目标大家都一样)。
对象间引用会产生一个叫GC Root(利用chrome的memory非常容易获取到这个)的东西,而这种算法说白了就是定期的从GC Root开始找到所有能被引用和不能被引用的对象,然后删除那些不能被引用的对象,这就是javascript内存管理的基本本质了。
13 回答13k 阅读
7 回答2.1k 阅读
3 回答2.6k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
未被闭包引用的变量将被回收,可以用
console.dir()
打印出函数的属性,来查看它[[scope]]
:将会得到 fn1 只保留了变量a,变量bc被回收了。
如果再添加一个闭包:
可以看到,变量a、b被闭包引用,没有被回收,只有c被回收了