即兴的模块

2015 年之前,JavaScript 语言没有内置的模块系统。 然而,尽管人们已经用 JavaScript 构建了十多年的大型系统,他们需要模块。

所以他们在语言之上设计了自己的模块系统。 你可以使用 JavaScript 函数创建局部作用域,并使用对象来表示模块接口。

这是一个模块,用于日期名称和数字之间的转换(由DategetDay方法返回)。 它的接口由weekDay.nameweekDay.number组成,它将局部绑定名称隐藏在立即调用的函数表达式的作用域内。

  1. const weekDay = function() {
  2. const names = ["Sunday", "Monday", "Tuesday", "Wednesday",
  3. "Thursday", "Friday", "Saturday"];
  4. return {
  5. name(number) { return names[number]; },
  6. number(name) { return names.indexOf(name); }
  7. };
  8. }();
  9. console.log(weekDay.name(weekDay.number("Sunday")));
  10. // → Sunday

这种风格的模块在一定程度上提供了隔离,但它不声明依赖关系。 相反,它只是将其接口放入全局范围,并希望它的依赖关系(如果有的话)也这样做。 很长时间以来,这是 Web 编程中使用的主要方法,但现在它几乎已经过时。

如果我们想让依赖关系成为代码的一部分,我们必须控制依赖关系的加载。 实现它需要能够将字符串执行为代码。 JavaScript 可以做到这一点。