let a = []; function test1(){ let ta = Math.random(); let tb = "test2"; let obj1 = { t1: ta } a.push(obj1); } test1();
请问这样调用了之后函数test1还会释放内存吗?全局变量a放入了一个对象的引用,该对象在函数test1里面,为什么我觉得test1不会释放内存呢?请教一下大家。。。。
认证高级PHP讲师
a和test1共享一个运行上下文,也就是a和test1共存亡吧~不知道我的理解有没有错~例如:
function test() { let a = []; function test1(){ let ta = Math.random(); let tb = "test2"; let obj1 = { t1: ta } a.push(obj1); } test1(); } test();
执行完test以后,我认为test1是会释放的,a也会被释放。假如不是在函数中而是直接在window下的话,test1始终存在啊~
之前理解有误,这应该是两个问题。
执行完后,test1的变量没有被直接引用,所以test1的执行环境即上下文应该会被回收,这不是闭包。另外,test1的函数体本身是属于其所在上下文的一个属性,只要这个上下文还在,这个函数体本身就不会被回收。
先说结论,不是首先闭包的定义就是能够访问自由变量的函数,在定义上就不符合了
再你的理解有误 把你的例子改一下
let a = []; function test1(){ let ta = Math.random(); let tb = "test2"; let obj1 = { t1: ta } return obj1; } a.push(test1())
a里面同样存在了原obj1指向的对象,但你觉得这还是闭包吗?
在你的例子里,test1执行完成后ta,tb,obj1都被释放了在其中创建的obj1变量指向的对象,由于加入到了a这个全局变量中,在test1执行完后,a[0]指向了这个对象,由于这个对象被a[0]引用,所以不会被释放,但是和obj1已经没有关系了,在整个过程中obj1的作用域都没有改变,a里面push的是obj1指向的对象而不是obj1
这样说不知你能不能理解,语文水平太差,感觉讲不太清楚= =
a和test1共享一个运行上下文,也就是a和test1共存亡吧~
不知道我的理解有没有错~例如:
执行完test以后,我认为test1是会释放的,a也会被释放。
假如不是在函数中而是直接在window下的话,test1始终存在啊~
之前理解有误,这应该是两个问题。
执行完后,test1的变量没有被直接引用,所以test1的执行环境即上下文应该会被回收,这不是闭包。另外,test1的函数体本身是属于其所在上下文的一个属性,只要这个上下文还在,这个函数体本身就不会被回收。
先说结论,不是
首先闭包的定义就是能够访问自由变量的函数,在定义上就不符合了
再你的理解有误
把你的例子改一下
a里面同样存在了原obj1指向的对象,但你觉得这还是闭包吗?
在你的例子里,test1执行完成后ta,tb,obj1都被释放了
在其中创建的obj1变量指向的对象,由于加入到了a这个全局变量中,在test1执行完后,a[0]指向了这个对象,由于这个对象被a[0]引用,所以不会被释放,但是和obj1已经没有关系了,在整个过程中obj1的作用域都没有改变,a里面push的是obj1指向的对象而不是obj1
这样说不知你能不能理解,语文水平太差,感觉讲不太清楚= =