Javascript 在节点中运行js文件时返回空对象

Javascript 在节点中运行js文件时返回空对象,javascript,node.js,Javascript,Node.js,当我尝试重新分配module.exports时,此仍然指向一个空对象 module.exports={a:4} console.log(this)/{} 但是,当我向module.exports添加新属性时,将指向具有新属性的对象 module.exports.a=4 console.log(this)/{a:4} 为什么在这两种情况下我得不到相同的结果?在模块中,默认情况下,此指向模块系统在设置模块时创建的原始导出对象。当您这样做时: module.exports = {a: 4} co

当我尝试重新分配module.exports时,
仍然指向一个空对象

module.exports={a:4}
console.log(this)/{}
但是,当我向
module.exports
添加新属性时,
将指向具有新属性的对象

module.exports.a=4
console.log(this)/{a:4}

为什么在这两种情况下我得不到相同的结果?

在模块中,默认情况下,
指向模块系统在设置模块时创建的原始
导出
对象。当您这样做时:

module.exports = {a: 4}
console.log(this);
模块
对象上现有的
导出
属性替换为新的单独属性。但是,
仍然指向原始的空
导出对象。因此,当您这样做时:

module.exports = {a: 4}
console.log(this);
创建新的
导出
对象后,
仍指向您从未修改过的原始
导出
对象。所以,它仍然显示该对象为空

如果在使用如上所述的新对象重新指定exports属性后,执行以下操作:

console.log(module.exports === this);            // false
您将看到
未指向新的
导出
对象,该对象是您在
模块
对象上指定为属性的


另一方面,当您执行此操作时:

module.exports.a = 4
您没有替换现有的
导出
对象。相反,您只是将一个属性添加到现有对象中,因此您修改的对象是该
仍然指向的原始
导出对象。

根据

当需要JavaScript文件作为节点模块时,节点引擎在包装函数中运行模块代码。当
设置为
module.exports时,调用该模块包装函数

因此,
module.exports
this
在执行以下操作时指向同一对象,即
{}

module.exports={a:4}
console.log(this)/{}
module.exports
开始指向一个新对象,它是
{a:4}
,而
这个
仍然指向前一个对象,它是
{}

但是,当你做以下事情时

module.exports.a=4
console.log(this)/{a:4}
您最终将更新
module.exports
以及
this
指向的对象。因此,
this
返回
{a:4}