javascript - 当另一个文件中的值更改时,全局变量不会更新nodejs

标签 javascript node.js arrays module javascript-objects

在nodejs中,我尝试更新从另一个文件导出的全局变量并再次检查结果。原始文件和导入文件中的变量值不同。

我运行文件 test.js 并检查结果。 DataCommon.js 和 test.js 中的 gDataChange 虽然是同一个变量,但结果不同。

DataCommon.js中,我导出了 gDataChange 变量

let gDataChange = [];

function printArray()
{
    console.log('DataCommon.js call ', gDataChange);
}

function setArray(lArray)
{
    gDataChange = [...lArray];
}

module.exports = {
    gDataChange,
    printArray,
    setArray
}

test.js 中,我将一些数据推送到全局数组中,并调用函数 setArray 来更改它。

var { gDataChange, printArray, setArray} = require('../../res/DataCommon.js');

if (!gDataChange.length)
{
    gDataChange.push(1);
    gDataChange.push(2);
    gDataChange.push(1);
    gDataChange.push(3);
}

function testGlobalVar() {
    let newData = [...gDataChange];
    newData = newData.filter((number)=>{
        return number != 1;
    });
    setArray(newData);
}

testGlobalVar();

console.log('test.js call ', gDataChange);
printArray();

setTimeout(() => {
    console.log(gDataChange);
}, 10000);

enter image description here

如果我使用array.splice(),则2个文件的gDataChange是相同的。但是如果我像上面一样使用 array.filter() 并重新分配数组,则 2 个文件的 gDataChange 是不同的。 当我用 array.filter() 重新分配时,我不确定 gDataChange 是否被创建为新的,因为在这种情况下我无法检查变量的地址。

最佳答案

Node.js 模块系统是单例和模块缓存,模块系统一次又一次引用完全相同的文件。例如:

计数器.js

let value = 0

module.exports = {
  increment: () => value++,
  get: () => value,
}

app.js

const counter1 = require(‘./counter.js’)
const counter2 = require(‘./counter.js’)

counter1.increment()
counter1.increment()
counter2.increment()

console.log(counter1.get()) // prints 3
console.log(counter2.get()) // also prints 3

就您而言,情况也是如此。但是,您正在更改数组 gDataChange 的引用。检查以下代码:

let arr = [1, 2, 3, 4];
const arr1 = arr.filter(x => x % 2 === 0); // this filter returns new array that refers to the new filtered data.

console.log(arr1); // new array

const arrOld = arr; // assigned reference of old array to new variable

arr = arr1; // assigning filtered data reference to arr

console.log(arr, arrOld); // you are seeing this in your code.

因此,值的变化不是因为 Node ,而是因为您正在更改对对象的引用。这就是 JS 对象的工作原理。即使您分配过滤器数组值,您也会创建新数组。

let gDataChange = [];

function printArray()
{
    console.log('DataCommon.js call ', gDataChange);
}

function setArray(lArray)
{
    gDataChange = [...lArray]; // here a new array reference with filter values are assigned.
// now if you change anything in the filter array it won't reflect here.
}

module.exports = {
    gDataChange,
    printArray,
    setArray
}

您可以查看如何node modules已解决。

关于javascript - 当另一个文件中的值更改时,全局变量不会更新nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70527999/

相关文章:

javascript - js : trigger function after a bunch of events were called

javascript - 使用 JavaScript ES6 箭头函数的立即函数

javascript - 根据父文件夹在文件夹中搜索特定文件类型

javascript - 一行推送item数组并返回item

javascript - 使用 bool 构造函数和内部 if 的类型强制有什么区别

javascript - 参数值 '<'转换为 '&lt;'

javascript - Express、http-proxy-middleware 和 net::ERR_CONNECTION_REFUSED

java - 如何使用 JUnit 测试对象数组

javascript - 有没有一种简单的方法来匹配字节数组中的字节数组?

ruby - 将来自两个不同数组的元素配对成 Ruby 中的哈希