在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);
如果我使用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/