Node.js应用中调用方法时如何重置循环变量?未恢复默认值问题
问题原因与解决方案
问题根源
Node.js模块导出的对象属于引用类型,当你在handlePages.js里直接修改从settings.js导入的posts对象时,实际上是在修改原模块中posts的内存引用值——第一次调用后settings.js里的posts.cnn已经被改成了22,第二次调用自然会从这个被修改后的值继续累加。
解决方法
方法1:每次操作创建默认对象的副本
在getPages函数里先复制一份默认的posts对象,后续操作都基于这个副本,不会影响原模块的初始值:
// settings.js module.exports = { posts: { cnn: 2, bbc: 4 } }; // handlePages.js const { posts: defaultPosts } = require('./settings.js'); function getPages() { // 使用扩展运算符创建对象副本 const posts = { ...defaultPosts }; for (let i = 0; i < 4; i++) { posts.cnn += 5; console.log(posts.cnn); } return posts; } function generatePages() { getPages(); }
方法2:用函数返回默认对象
把默认值包装成函数,每次调用函数都会返回一个全新的初始对象:
// settings.js module.exports = { getDefaultPosts: () => ({ cnn: 2, bbc: 4 }) }; // handlePages.js const { getDefaultPosts } = require('./settings.js'); function getPages() { // 每次调用都获取新的初始对象 const posts = getDefaultPosts(); for (let i = 0; i < 4; i++) { posts.cnn += 5; console.log(posts.cnn); } return posts; }
方法3:直接导出初始数值,基于初始值计算
如果只是需要单个数值的初始值,可以直接导出原始值,每次计算时基于这个初始值重新累加:
// settings.js module.exports = { DEFAULT_CNN: 2, DEFAULT_BBC: 4 }; // handlePages.js const { DEFAULT_CNN } = require('./settings.js'); function getPages() { let currentCnn = DEFAULT_CNN; for (let i = 0; i < 4; i++) { currentCnn += 5; console.log(currentCnn); } return { cnn: currentCnn, bbc: DEFAULT_BBC }; }
内容的提问来源于stack exchange,提问作者The Dead Man
相关产品推荐
相关产品推荐

