You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环中使用require不符合预期的问题排查

问题根源分析

这不是闭包的问题,核心原因出在模块构造函数的调用方式和this的指向上:

你的模块里定义的是构造函数(比如exampleModuleName1),但你调用的时候用的是require(requireNamePath)(),而不是new require(requireNamePath)()。在非严格模式下,直接调用函数时this会指向全局对象(Node.js中是global,浏览器中是window)。

这就导致了:

  1. 第一次调用require('./slimShady.js')()时,你给全局对象添加了getName方法,返回'myNameIsSlimShady'
  2. 第二次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:17:43