Heim > Fragen und Antworten > Hauptteil
let a = [];
function test1(){
let ta = Math.random();
let tb = "test2";
let obj1 = {
t1: ta
}
a.push(obj1);
}
test1();
Wird Funktion test1 nach einem solchen Aufruf immer noch Speicher freigeben?
Globale Variable a enthält einen Verweis auf ein Objekt, das sich in der Funktion test1 befindet. Warum glaube ich, dass test1 den Speicher nicht freigibt? Bitte geben Sie mir einen Rat. . . .
淡淡烟草味2017-05-19 10:44:53
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始终存在啊~
滿天的星座2017-05-19 10:44:53
之前理解有误,这应该是两个问题。
执行完后,test1的变量没有被直接引用,所以test1的执行环境即上下文应该会被回收,这不是闭包。另外,test1的函数体本身是属于其所在上下文的一个属性,只要这个上下文还在,这个函数体本身就不会被回收。
淡淡烟草味2017-05-19 10:44:53
先说结论,不是
首先闭包的定义就是能够访问自由变量的函数,在定义上就不符合了
再你的理解有误
把你的例子改一下
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
这样说不知你能不能理解,语文水平太差,感觉讲不太清楚= =