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的重新赋值而改变。
拆解你的代码执行流程:
- 第一步
module.exports.varOne = 'one':此时module.exports是Node自动创建的空对象,我们给它添加了varOne属性,此时this指向这个被修改后的初始对象(即{varOne: 'one'})。 - 第二步
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
相关产品推荐
相关产品推荐

