模块间导出引用问题:导出函数在另一模块引用显示undefined
问题分析与解决方案
嘿,这问题其实是模块导出的逻辑搞混啦,我来给你理清楚~
问题根源
你在setup.js里写的module.exports = randomString;,是把整个模块直接导出成这个函数本身,而不是导出一个包含randomString属性的对象。所以当你在config.js里require('./setup')之后,setup变量就是那个randomString函数,而不是一个带有randomString方法的对象——这就是为什么setup.randomString会返回undefined。
另外你想要的是函数执行后的结果,我们可以根据需求选不同的解决方式:
方案1:导出包含函数的对象(保留函数可复用性)
如果你希望既能在setup.js内部使用函数,又能在config.js里调用它拿到结果,修改setup.js的导出方式,把函数放在对象里:
// setup.js let randomString = function() { return Math.random().toString(36).slice(2); }; console.log(randomString()); // SxIARFSSvw // 导出包含函数的对象 module.exports = { randomString };
然后在config.js里调用这个函数:
// config.js const setup = require('./setup'); console.log(setup.randomString()); // 输出类似SxIARFSSvw的结果
方案2:直接导出函数执行后的结果(如果不需要复用函数)
如果你只需要在config.js里拿到函数执行后的字符串,不需要保留函数本身,可以直接导出结果:
// setup.js let randomString = function() { return Math.random().toString(36).slice(2); }; const result = randomString(); console.log(result); // SxIARFSSvw module.exports = result;
然后在config.js里直接使用:
// config.js const randomStringResult = require('./setup'); console.log(randomStringResult); // 直接输出SxIARFSSvw这类结果
方案3:不修改setup.js,直接调用导入的函数
如果不想改动setup.js的代码,那在config.js里直接把导入的变量当作函数调用就行——因为setup本身就是你定义的randomString函数:
// config.js const randomString = require('./setup'); console.log(randomString()); // 同样能拿到你想要的随机字符串
核心逻辑就是:CommonJS模块中,module.exports赋值的是什么,require之后拿到的就是什么。你之前把函数直接赋值给了module.exports,所以导入后得到的是函数本身,而不是带该函数的对象~
内容的提问来源于stack exchange,提问作者Husain Ashraf
相关产品推荐
相关产品推荐

