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

Node.js CommonJS中this未随module.exports更新的问题咨询

为什么Node.js CommonJS模块中this没有指向重新赋值后的module.exports?

问题代码

module.exports.varOne = 'one'

module.exports = {varTwo: 'two', ...module.exports}

console.log('module', module);
console.log(this, this === module.exports);

运行结果

module Module {
  id: '.',
  path: '...',
  exports: { varTwo: 'two', varOne: 'one' },
  parent: null,
  filename: '...',
  loaded: false,
  children: [],
  paths: [...]
}
{ varOne: 'one' } false

原因解释

在Node.js的CommonJS模块机制中,模块顶层作用域的this指向是模块初始化时创建的初始module.exports对象,这个指向是固定不变的,不会随着后续对module.exports的重新赋值而改变。

拆解你的代码执行流程:

  1. 第一步module.exports.varOne = 'one':此时module.exports是Node自动创建的空对象,我们给它添加了varOne属性,此时this指向这个被修改后的初始对象(即{varOne: 'one'})。
  2. 第二步module.exports = {varTwo: 'two', ...module.exports}:这里是直接给module.exports变量赋值了一个全新的对象——我们把之前的初始对象(也就是this指向的那个)的属性展开到新对象里,所以新的module.exports变成了{varTwo: 'two', varOne: 'one'}。但this的指向依然停留在原来的初始对象上,并没有切换到新对象。

这就是为什么打印this时显示的是旧的{varOne: 'one'},和新的module.exports比较结果为false。

内容的提问来源于stack exchange,提问作者Houider Walid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:10:27