何为模块?

模块(Modules)是使用不同方式加载的 JS 文件(与 JS 原先的脚本加载方式相对)。这种不同模式很有必要,因为它与脚本(script)有大大不同的语义:

  1. 模块代码自动运行在严格模式下,并且没有任何办法跳出严格模式;

  2. 在模块的顶级作用域创建的变量,不会被自动添加到共享的全局作用域,它们只会在模块顶级作用域的内部存在;

  3. 模块顶级作用域的 this 值为 undefined ;

  4. 模块不允许在代码中使用 HTML 风格的注释(这是 JS 来自于早期浏览器的历史遗留特性) ;

  5. 对于需要让模块外部代码访问的内容,模块必须导出它们;

  6. 允许模块从其他模块导入绑定。

这些差异乍一看似乎很小,但它们代表了 JS 代码加载与执行方面的显著改变,我将在整章中对其进行论述。模块的真实力量是按需导出与导入代码的能力,而不用将所有内容放在同一个文件内。对于导出与导入的清楚理解,是辨别模块与脚本差异的基础。