JavaScript全局变量dataCount跨文件更新后仍为0问题求助
问题:更新后访问dataCount变量始终返回0
尝试在另一个文件中访问经updateData函数更新后的dataCount变量,该函数接收数组作为参数,并将push方法返回的新长度传入updateStatus函数,但更新后访问该变量仍返回0。
相关代码
status.js 文件
var dataCount = 0; let data = [] function updateStatus(num, opp){ if (opp == "add"){ dataCount += num } else if (opp == "sub") { dataCount -= num } else { dataCount = num; } } function updateData(arr){ updateStatus(data.push(arr), 'update'); } module.exports = { dataCount: dataCount, updateStatus: updateStatus, data: data, updateData: updateData }
middleware.js 文件
const status = require('./status'); const methods = require('./helperFunctions') class Middleware{ constructor(){ } async populateIfLess(req, res, next){ if (status.dataCount < 4){ try { // 从数据库获取数据并存储到data中 const data = await methods.fetchMeaning(); Object.entries(data).map(entry => { status.updateData([entry[0], entry[1]]) }) methods.log('Data populated on') setTimeout(() => { console.log(status.dataCount) }, 1500); next() } catch (error) { methods.log(error); res.send({ERROR: "Something went wrong, please check log file."}).end() } } } }
问题原因
核心问题是JavaScript原始类型(数字、字符串等)按值传递:
- 你在
module.exports中导出的dataCount: dataCount,本质是把当时的0这个数值复制了一份作为导出对象的属性。 - 后续调用
updateStatus修改内部的dataCount变量时,只是修改了内部的数值,并不会同步到导出对象里的副本,所以外部访问status.dataCount始终是最初的0。
updateData里用data.push(arr)返回的数组新长度设置dataCount的逻辑本身没问题,但因为导出的是副本,外部依旧拿不到更新后的值。
解决方案
以下两种方式都能让外部获取到dataCount的实时值:
方案1:使用Getter属性导出
修改status.js的导出部分,用getter属性动态返回当前的dataCount值:
module.exports = { get dataCount() { return dataCount; }, // 每次访问都会获取最新的内部值 updateStatus: updateStatus, data: data, updateData: updateData }
之后外部代码中status.dataCount每次被访问时,都会执行这个getter函数,返回内部最新的dataCount值。
方案2:将dataCount存入引用类型对象
把dataCount和data都放在一个对象里,对象是引用类型,导出后外部访问的是同一个引用:
// status.js 修改后 const store = { dataCount: 0, data: [] }; function updateStatus(num, opp){ if (opp == "add"){ store.dataCount += num } else if (opp == "sub") { store.dataCount -= num } else { store.dataCount = num; } } function updateData(arr){ updateStatus(store.data.push(arr), 'update'); } module.exports = { store, // 直接导出整个对象,外部访问status.store.dataCount updateStatus: updateStatus, updateData: updateData }
在middleware.js中,将status.dataCount替换为status.store.dataCount即可获取最新值。
额外优化提示
因为data.push(arr)返回的就是数组的新长度,dataCount和data.length完全同步,你可以直接去掉dataCount变量,让外部访问status.data.length,减少冗余的状态维护。
内容的提问来源于stack exchange,提问作者Tanmay Chavan
相关产品推荐
相关产品推荐

