在另一个文件 nodejs 中更改值时不会更新全局变量
global variable is not updated when changed value in another file nodejs
在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模块系统是单例和模块缓存,模块系统一次又一次地引用完全相同的文件。例如:
counter.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.
因此,值的更改不是因为节点,而是因为您正在更改对对象的引用。这就是 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 是如何解决的。
在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模块系统是单例和模块缓存,模块系统一次又一次地引用完全相同的文件。例如:
counter.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.
因此,值的更改不是因为节点,而是因为您正在更改对对象的引用。这就是 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 是如何解决的。