modules.exports 和 CommonJs 中的 "this" 一样吗?

modules.exports is the same as "this" in CommonJs?

我不小心在 javascript 模块上使用了 require(),该模块旨在与浏览器一起使用。 模块集 this['libraryName'] = ...。 我注意到它实际上 有效

所以,我创建了 2 个文件:

test1.js

console.log( require('./test2.js'))

test2.js

console.log(this === module.exports)
this.SOMETHING = 10

结果?

$ node ./test1.js 
true
{ SOMETHING: 10 }
$

我没想到会这样! true 意味着 module.exports 与全局上下文中的 this 相同。

  1. 这不是新的:
    1. Meaning of "this" in node.js modules and functions
    2. 等等
  2. 这不是规格的一部分https://nodejs.org/api/globals.html#globals_global

    That means that in browsers if you're in the global scope var something will define a global variable. In Node.js this is different.

    当有些东西不同时,它们绝对不属于任何规范。

  3. Doesn't this make it immensely easier to create files that will work if they are imported OR required?

    不知道怎么办。在 node.js 中,this.SOMETHING = 10 仅将一个名称 (module.exports) 更改为另一个名称 (this)。仅此而已。
    如果您尝试使用 webpack 或 <script type="module" src="..."></script>test2.js 导入浏览器,您将在这两种情况下得到 TypeError: undefined has no properties

  4. typeof require === 'undefined'

    也许 browser-requirebrowserify 或类似的东西会更好。