循环中使用require不符合预期的问题排查
问题根源分析
这不是闭包的问题,核心原因出在模块构造函数的调用方式和this的指向上:
你的模块里定义的是构造函数(比如exampleModuleName1),但你调用的时候用的是require(requireNamePath)(),而不是new require(requireNamePath)()。在非严格模式下,直接调用函数时this会指向全局对象(Node.js中是global,浏览器中是window)。
这就导致了:
- 第一次调用
require('./slimShady.js')()时,你给全局对象添加了getName方法,返回'myNameIsSlimShady' - 第二次调用
require('./chickaChicka.js')()时,你又给同一个全局对象覆盖了getName方法,返回'ChickaChicka'
所以不管你把哪个"实例"存在数组里,它们本质上都是指向同一个全局对象,调用getName()自然只会返回最后一次覆盖的结果。
两种解决方案
方案1:用new关键字实例化构造函数
修改你存储theReq的代码,给构造函数加上new,这样每次调用都会创建一个独立的实例,this指向当前实例:
tableRequiredList.push({ "name": requireNamePath, "theReq": new require(requireNamePath)() // 这里添加new关键字 });
方案2:修改模块,返回独立对象(更推荐)
把模块改成直接返回包含getName的独立对象,彻底避免依赖this的指向问题:
调整slimShady.js:
((module) => { module.exports = function() { return { getName: function() { return 'myNameIsSlimShady'; } }; }; })(module);
调整chickaChicka.js:
((module) => { module.exports = function() { return { getName: function() { return 'ChickaChicka'; } }; }; })(module);
这样每次调用require(...)()都会返回一个全新的对象,各自的getName方法互不干扰。
验证修复结果
修改后重新运行代码,tableRequiredList[0].theReq.getName()会正确返回'myNameIsSlimShady',tableRequiredList[1].theReq.getName()返回'ChickaChicka',和预期一致。
内容的提问来源于stack exchange,提问作者Slyke
相关产品推荐
相关产品推荐

