JS - 理解闭包

时间:2014-01-28 10:09:12

标签: javascript function web reference closures

我正在寻找一种动态更改函数返回值的方法。在以下示例中,getObjRef函数返回立即调用函数的结果,该函数是对象的引用。然后在一秒钟后它改变对象的值,但最初返回的引用不会改变。

问:我能以某种方式让它发挥作用吗?

function getObjRef() {
    var o = {val: 1};
    return(function (obj) {
        setTimeout(function () {
            //trying to change the referance after 1 sec
            obj = {val: 10};
            console.log("obj ->", obj);
            console.log("o ->", o);
        }, 1000);
        return obj;
    })(o)
}

var objRef = getObjRef();
console.log("objRef initial value->", objRef);
setTimeout(function () {
    console.log("objRef after 2 sec->", objRef)
}, 2000);

JSFiddle(查看日志)

2 个答案:

答案 0 :(得分:2)

如果你改变这一行,你可以使这项工作

obj = {val: 10};

到此:

obj.val = 10;

<强>解释

运行IIFE时,您将使用{ val: 1 }返回对象。由setTimeout()引起的闭包保留了指向该对象的指针。

但是,当回调执行时,在回调范围内,您可以通过对新对象的新引用来替换对原始对象的引用。此时,您实际上有两个对象:外部作用域中的一个({ val: 1 })和回调作用域中的一个({ val: 10 })。因此,当您稍后在外部作用域中记录对象时,似乎没有任何事情发生。

要解决此问题,您必须维护对外部作用域对象的引用,并且只需按照上面的代码更改其值。

答案 1 :(得分:0)

现在可以使用:http://jsfiddle.net/aJz26/1/

obj = {val: 10};更改为obj.val = 10;

<强>说明: 您必须更改引用对象的值(指针指向的对象),而不是将新对象分配给局部变量'obj',只是将局部变量设置为新值(但您想要更改'val '原始对象的属性。)