1

我不小心用require()在一个打算与浏览器一起使用的 javascript 模块上。模块设置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.exportsthis与全局上下文中的相同。

  • 那是新的吗?
  • 那是规格的一部分吗?
  • 这不是让创建在导入或需要时可以使用的文件变得非常容易吗?
  • 如果这行得通,为什么我们还要进行整个检查typeof require === 'undefined'
    • 多年来我一直没有注意到这么重要的事情吗?
4

1 回答 1

0
  1. 这并不新鲜:
    1. NodeJS 中的“全局”对象是什么
    2. node.js 模块和函数中“this”的含义
    3. 为什么模块级返回语句在 Node.js 中起作用?
    4. 等等
  2. 它不是规范的一部分https://nodejs.org/api/globals.html#globals_global

    这意味着在浏览器中,如果您在全局范围 var 中,某些东西将定义一个全局变量。在 Node.js 中这是不同的。

    当某些事情不同时,它们绝对不是任何规范的一部分。

  3. 这不是让创建在导入或需要时可以使用的文件变得非常容易吗?

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

  4. typeof require === 'undefined'

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

于 2020-02-26T14:49:00.910 回答