当为module.exports分配一个对象时,为什么这是一个空对象?

时间:2019-07-14 13:24:58

标签: javascript node.js this

我试图了解有关Node.js中的this关键字的简单概念。我的问题如下:

我知道Node.js中的this关键字是指模块的范围,而不是全局名称空间。并且当通过module.exports定义模块时,this的值应更改。但是,根据我分配给module.exports的内容,结果是不同的,这是我不了解的。请查看以下代码块:

1-在第一个示例中,module.exports.nameOfModule被分配了一个字符串。 this指向包含此字符串的对象:

module.exports.nameOfModule = 'This Tutorial Module';

console.log(this);
// > { nameOfModule: 'This Tutorial Module' }

2-在第二个示例中,module.exports被分配了一个对象。并且this确实引用了一个空对象。

module.exports = {
  nameOfTheModule: 'This tutorial module.',
};

console.log(this);
// > {}

为什么会这样?为什么在第二个示例中看不到this关键字中引用的分配对象?预先感谢!

2 个答案:

答案 0 :(得分:1)

exports变量在模块的文件级范围内可用,并在评估模块之前为其分配了module.exports的值。

  

它允许使用快捷方式,以便可以编写module.exports.f = ...   与exports.f = ...相比更简洁   变量,如果将新值分配给导出,则不再绑定   到module.exports:node ref

当您在module.exports上添加密钥时,密钥不会被覆盖

enter image description here

但是,当您分配一个完整的新值module.exports = 'some value'时,它并不一定是module.exports,它会用新值盖过exports

enter image description here

答案 1 :(得分:1)

最初,this关键字和module.exports(以及exports变量)都引用相同的对象。您可以通过向其添加属性来更改该对象,无论您如何引用该对象。

如果将新对象分配给module.exports,则仅.exports属性不引用新对象,而this仍然引用原始对象。这并不是一个神奇的吸气剂,它总是与module.exports引用相同的内容。