javascript - 平时闭包大家都是使用函数,假如我使用对象还是闭包吗?
PHP中文网
PHP中文网 2017-05-19 10:42:53
0
3
697
let a = [];
function test1(){
    let ta = Math.random();
    let tb = "test2";
    let obj1 = {
        t1: ta
    }
    a.push(obj1);
}

test1();
        

请问这样调用了之后函数test1还会释放内存吗?
全局变量a放入了一个对象的引用,该对象在函数test1里面,为什么我觉得test1不会释放内存呢?请教一下大家。。。。

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板