JS闭包相关 闭包内创建的对象如何获取?

我用一个全局对象,新建其一个属性来引用闭包内创建的对象

function fun(){
    return function(){
        var obj1={
            a:1,
            b:2
        };
        obj2.item=obj1;
    }
}
var obj2={};
fun();
console.log(obj2.item.a);

结果显示 Cannot read property 'a' of undefined
请问这样获取闭包内对象的方式错在哪?闭包内对象会自动释放吗?如果会自动释放,为什么?谢谢


第二个问题

var testButton1=document.getElementById("testButton1");
var testButton2=document.getElementById("testButton2");
testButton1.onclick=fun_1;
testButton2.onclick=fun_2;

function fun_1(){
    
    var obj1={
        a:1,
        b:2
    };
    obj2.item=obj1;
    
}

function fun_2(){
    console.log(obj2.item.a);
}
var obj2={};

结果也显示Cannot read property 'a' of undefined 是为什么

阅读 3.6k
3 个回答

匿名函数没有调用,局部变量调用后失效,闭包可以保持变量在内存中不被回收

       function fun(){
    return  (function(){
        var obj1={
            a:1,
            b:2
        };
        obj2.item=obj1;
    })();
}

或者

       function fun(){
    return  function(){
        var obj1={
            a:1,
            b:2
        };
        obj2.item=obj1;
    };
}
fun()();

返回值是函数,fun()只是调用外部函数,里面的函数并没有执行,将fun()改为fun()()即可。

你执行fun()的时候返回的是一个函数,这个函数还没有执行,
图片描述

所以要这样写:

function fun(){
    return function(){
        var obj1={
            a:1,
            b:2
        };
        obj2.item=obj1;
    }
}
var obj2={};
fun()();
console.log(obj2.item.a);

倒数第二段:fun() 改为 fun()()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题