Heim  >  Fragen und Antworten  >  Hauptteil

javascript - Normalerweise verwendet jeder Funktionen für Abschlüsse. Was ist, wenn ich Objekte oder Abschlüsse verwende?

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中文网2710 Tage vor640

Antworte allen(3)Ich werde antworten

  • 淡淡烟草味

    淡淡烟草味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始终存在啊~

    Antwort
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:44:53

    之前理解有误,这应该是两个问题。

    执行完后,test1的变量没有被直接引用,所以test1的执行环境即上下文应该会被回收,这不是闭包。另外,test1的函数体本身是属于其所在上下文的一个属性,只要这个上下文还在,这个函数体本身就不会被回收。

    Antwort
    0
  • 淡淡烟草味

    淡淡烟草味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

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

    Antwort
    0
  • StornierenAntwort