我正在寻找一种动态更改函数返回值的方法。在以下示例中,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(查看日志)
答案 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 '原始对象的属性。)