这是一个虚拟的例子:
const obj = {foo: '123'};
function logObj(obj) {
setInterval(function() {
console.log(obj);
}, 100)
}
function overWrite(obj) {
setTimeout(function(){
console.log('overwriting')
obj = {foo: 'bar'}
}, 1000);
}
logObj(obj)
overWrite(obj)
我希望每100毫秒看到一次{ foo: '123' }
,直到调用overwriting
为止,然后再看到{ foo: 'bar' }
。但是,该对象永远不会被覆盖,我总是看到123。
编辑
我不想只更改其中一个键;实际上,我确实想替换整个对象,因此obj.foo = 'bar'
并不是解决方案
答案 0 :(得分:2)
执行obj = {foo: 'bar'}
代替obj.foo= 'bar'
const obj = {
foo: '123'
};
function logObj(obj) {
setInterval(function() {
console.log(obj);
}, 100)
}
function overWrite(obj) {
setTimeout(function() {
console.log('overwriting')
obj.foo = 'bar'
}, 1000);
}
logObj(obj)
overWrite(obj)
答案 1 :(得分:2)
为了更好地了解正在发生的事情,让我们重命名变量。
const a = { foo: '123' };
function logObj(b) {
setInterval(function () {
console.log(b);
}, 1000);
}
function overWrite(c) {
setTimeout(function () {
console.log('overwriting');
c = { foo: 'bar' };
}, 5000);
}
logObj(a);
overWrite(a);
传递给函数的变量是主值的副本。
首先,您调用logObj
并复制值a
(对对象{ foo: '123' }
的引用)。该引用将在函数中以b
的形式提供。
然后,调用overWrite
并复制值a
(对对象{ foo: '123' }
的引用)。该引用将在函数中以c
的形式提供。在回调中,用新引用替换c
的内容。但是,这不会影响a
或b
的内容,并且仅在函数正文中可用。
这是一个简化的示例:
答案 2 :(得分:-1)