1. 在接触规范之前,我们用模块化来封装代码大多为如下:

;(function (形参模块名, 依赖项, 依赖项) {
  // 通过 形参模块名 修改模块

  window.模块名 = 形参模块名
 })(window.模块名 || {}, 依赖项, 依赖项)
  1. 分号是什么作用?

    答:为了防止前面的代码没有添加分号造成语法解析错误,也可能会是 "!", "+" 等
  2. 为什么要将代码放入一个自执行函数中

    答:为了避免全局命名空间污染,核心就是利用函数的私有作用域
  3. 为什么将依赖项作为参数传进来

    答:为了减少作用域查找机制

2. 常见的 JavaScript 模块化规范

规范其实就是这些库在推广的过程中逐渐形成的一套规则。

所谓的规范也就是:

定义了模块的书写格式

以及模块之间的交互规则

Node 环境

CommonJS

浏览器环境

AMD

    RequireJS
CMD Common Module Definition

    CMD 就是 SeaJS 这个模块加载器在推广的过程中定义的一个模块规范
ECMAScript

    ECMAScript 6

CMD、AMD、CommonJS 都是社区制定出来的模块规范,他们的目的都是为了解决 JavaScript 没有模块化系统的问题。 他们都有如何定义模块成员,以及模块成员之间如何进行通信交互的规则。

1.SeaJS基本介绍

  1. 在SeaJS中,一个js脚本文件就是一个模块

    模块具有两个特性:

    1. 模块要有一个私有作用域:避免全局命名空间污染
    2. 模块可以向外导出内部成员,供别的模块加载和使用

    所以:只要使用了SeaJS,那所有的js文件都通过define函数去定义该模块,并且将所有的模块代码写到 define 定义的回调函数中

    define 方法的回调函数中分别传递三个固定参数:

    1. require:
    2. exports
    3. module
  2. 每一个模块中有一个require函数可以用来加载指定模块,需要接收一个模块路径

    1. 加载指定模块并且执行该模块中的代码
    2. 得到该模块中的暴露的接口对象:module.exports
  3. 模块的作用域和导出

    模块天生就是一个私有作用域,在该模块内部定义的所有成员

    如果模块内部的成员想要被外部所访问:

    必须通过使用