Javascript通过引用传递,以后将在另一个文件中覆盖

时间:2019-03-22 17:55:14

标签: javascript node.js

这是一个虚拟的例子:

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'并不是解决方案

3 个答案:

答案 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的内容。但是,这不会影响ab的内容,并且仅在函数正文中可用。

这是一个简化的示例:

variable diagram

答案 2 :(得分:-1)

解决方案很简单,将const obj更改为var obj = {...}

正如您在this文章中所看到的,使用varconstlet声明变量时有所不同。

  

const无法更新或重新声明