JavaScript模块中类似于window对象的等效物是什么?

3

在常规脚本中,可以通过字符串名称调用函数,例如window["myFunc"]()

除了声明对象并将方法分配给它之外,在类型为“module”的JS脚本的“顶层”是否有相当的方法可用于调用函数?

谢谢。

2个回答

2

模块的一个主要好处之一是允许避免全局污染的代码。模块的顶层类似于IIFE - 模块可以看到所有全局内容,但是除了以下情况外,没有东西可以看到模块内部声明的内容:

  • 模块可以从其他模块导入
  • 模块可以向其他模块导出

虽然在技术上你可以做一些像这样的事情:

window.foo = 'foo';

在一个模块内,编写使用该路由的脚本将完全违背使用模块系统的目的。明确的依赖关系可以使代码更易于维护。

在模块的范围内或其内部全局命名空间(我不知道更好的术语)中,函数声明被分配给什么? - Gary
将函数定义到模块的顶层环境中——就像标准变量定义const foo = 'bar';被分配给它们的环境一样(通常是封闭块,如果没有封闭块则为顶层)。如果您不做任何奇怪的事情并理解提升的影响,您可以认为对于大多数目的,function fn() { ...等同于const fn = function() {——这就像声明另一个变量。 - CertainPerformance
谢谢。当然,我之前没有理解它;但现在似乎明白了。 - Gary
我不确定我完全同意这是一个好处。显然,您可以直接在模块中定义变量,而无需在另一个作用域内定义它们,但由于某种原因,您无法像通过“window”父对象访问全局作用域一样访问此“模块”作用域。我希望至少有一个“模块”对象,您可以在模块内部访问它。JavaScript的极端灵活性是我喜欢这种语言的原因,但在这里,他们不知何故忽略了这一点。 - Johncl

0

没有等价的东西。即使在非模块中,letconstclass 声明也不会成为全局对象或任何其他对象的属性。

(这其实是一件好事!显式优于隐式。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接