【发布时间】:2019-04-03 06:42:00
【问题描述】:
我正在尝试通过 typescript 文档来了解与 ES6 模块相同的模块。
typescript-modules - typescript 模块的文档。它说
模块在自己的范围内执行,而不是在全局范围内;这意味着在模块中声明的变量、函数、类等在模块外是不可见的,除非它们使用其中一种导出形式显式导出。相反,要使用从不同模块导出的变量、函数、类、接口等,必须使用其中一种导入形式导入。
和
在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级导入或导出的文件都被视为一个模块。相反,没有任何顶级导入或导出声明的文件被视为其内容在全局范围内可用的脚本(因此也可用于模块)。
它表示文件中没有导入或导出语句的任何内容都可以全局使用。但事实并非如此。
- 文件夹
- script1.js
- script2.js
script1.js
var variable = "Hello";
script2.js
console.log(variable);
根据文档中写的语句,当我运行 script2.js 时,它不应该给出任何错误并控制台变量的值,因为 script1.js 没有导入、导出语句,因此变量在全局中可用范围。但它给出了一个错误。那么脚本的内容在全局范围内可用是什么意思呢?
【问题讨论】:
-
我的理解,全局范围是指整个特定脚本中变量的范围
-
“但它给出了一个错误。”你可能在
script1.js之前运行script2.js。您的代码将将variable导出到全局范围,并且可以通过该脚本之外的console.log(variable)访问它。您可以尝试在控制台中运行该日志语句,它会产生您输入的值。除非您有一些捆绑工具,可以自动包装每个脚本并将其与全局范围隔离。 -
在一些相关的注释上 - JavaScript 有两个范围 - 全局和函数。这有点过于简单了,但仍然 - 脚本的内容将被导出到全局范围,但脚本 content 可以是 function。这意味着里面的任何东西都不会在全局范围内。通过包装 in a function expression 将脚本彼此隔离是一种常见的技术
标签: javascript typescript es6-modules