javascript - Normalerweise verwendet jeder Funktionen für Abschlüsse. Was ist, wenn ich Objekte oder Abschlüsse verwende?
PHP中文网
PHP中文网 2017-05-19 10:42:53
0
3
694
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. . . .

PHP中文网
PHP中文网

认证高级PHP讲师

Antworte allen(3)
淡淡烟草味

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

这样说不知你能不能理解,语文水平太差,感觉讲不太清楚= =

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage