模块和脚本之间有什么区别?

5
我正在阅读TypeScript文档,以了解与ES6模块相同的模块。 typescript-modules- TypeScript模块文档。它说:
模块在其自身的作用域中执行,而不是在全局作用域中执行。这意味着在模块中声明的变量、函数、类等,在未使用其中一种导出形式显式导出时,不会在模块外部可见。反过来,要使用从不同模块导出的变量、函数、类、接口等,必须使用其中一种导入形式进行导入。
并且
在TypeScript中,就像在ECMAScript 2015中一样,包含顶级导入或导出的任何文件都被视为模块。相反,没有任何顶级导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。
它说没有导入或导出语句的文件中的任何内容都可以全局使用。但这是不正确的。
  • folder
    • script1.js
    • script2.js

script1.js

var variable = "你好";

script2.js

console.log(variable);

根据文档中的说明,当我运行script2.js时,它不应该出现任何错误,并且会像script1.js一样在控制台中输出变量的值,因为script1.js没有导入和导出语句,因此变量在全局范围内可用。但是它却出现了错误。那么“脚本内容在全局范围内可用”是什么意思?

我的理解是,全局作用域指的是变量在整个脚本中的作用范围。 - Krishna Prashatt
1
“但是它会报错。” 你可能在运行 script1.js 之前运行了 script2.js。你的代码variable 导出到全局作用域中,因此可以使用 console.log(variable) 在该脚本之外访问它。您可以尝试在控制台中运行该日志语句,它将生成您放置在其中的值。除非您有一些捆绑工具自动从全局范围包装和隔离每个脚本。 - VLAZ
有点相关的是 - JavaScript 有两个作用域 - 全局和函数。这有点过于简化了,但仍然如此 - 脚本的内容将被导出到全局作用域,但脚本的内容可以是一个函数。这意味着里面的任何东西都不会在全局作用域中。通过将它们包装在函数表达式中,将脚本彼此隔离是一种常见的技术。 - VLAZ
2个回答

3
在HTML文件中,如果您使用<script src="./script2.js" /><script src="./script1.js" />的方式加载脚本,您将在控制台看到Hello输出。

0

我认为你需要运行script1.js文件以便获取已声明的变量。尝试先执行script1.js文件,然后再执行script2.js。


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