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
相同。
- 这是新的吗?
- 这是规格的一部分吗?
- 这难道不会让创建在导入或需要时有效的文件变得非常容易吗?
- 如果这可行,为什么我们还要进行整个检查
typeof require === 'undefined'
?
- 年 这么重要的事情我都忘了吗?
- 这不是新的:
- Meaning of "this" in node.js modules and functions
- 等等
这不是规格的一部分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.
当有些东西不同时,它们绝对不属于任何规范。
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
。
typeof require === 'undefined'
也许 browser-require
、browserify
或类似的东西会更好。
我不小心在 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
相同。
- 这是新的吗?
- 这是规格的一部分吗?
- 这难道不会让创建在导入或需要时有效的文件变得非常容易吗?
- 如果这可行,为什么我们还要进行整个检查
typeof require === 'undefined'
?- 年 这么重要的事情我都忘了吗?
- 这不是新的:
- Meaning of "this" in node.js modules and functions
- 等等
这不是规格的一部分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.
当有些东西不同时,它们绝对不属于任何规范。
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
。typeof require === 'undefined'
也许
browser-require
、browserify
或类似的东西会更好。