Javascript 在节点中运行js文件时返回空对象
当我尝试重新分配module.exports时,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={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}