插件

在全局对象 window 导出的方法

  • 从功能的角度

    1. ;(function(){
    2. class Slider{}
    3. window.Slider = Slider;
    4. })();

    组件

    通过特定功能的 UI

  • 从视图的角度

模块化发展历史

  1. 定义全局函数,一个函数实现一个功能 ```javascript function m1(){

} function m2(){

}


2. 减少全局函数,使用对象作 namespace
```javascript
var obj = {
  m1: function m1(){

  },
  m2: function m2(){

  }
}
  1. 使用 IIFE 实现全局对象的包裹,封闭作用域

    var module = (function(){
    function m1(){
    
    }
    function m2(){
    
    }
    var obj = {
       m1: m1,
     m2: m2
    }
    
    return {
       obj: obj
    }
    })();
    

    为什么不用构造函数或类,要用立即执行函数

    因为在类中,是把功能相关的封闭在一起,但是在模块中,其功能关联性没有这么密切或完全不相关。如果都封闭在同一个类中就不是那么合理。我们会把相关性非常强的封装为一个类。
    类是一种思维抽象,类属性和类方法是为描述当前的类所具备的属性与方法。

而用于立即执行函数的原因是 函数立即执行完成之后,作用域会销毁。声明的变量与函数在没有引用(可以通过闭包方式把引用返回出去)时都会被销毁(通过垃圾回收的方式进行对内存回收,不会占用内存),只会有一个返回值,从而做到变量的私有化。

放大模式 与 宽放大模式

通过模块的注入,把依赖私有化

  • 放大模式就是注入
  • 宽放大模式是增加 || 当没有传入时有默认值 ```javascript var module = (function($){ function m1(){

    } function m2(){

    } var obj = {

    m1: m1,
    

    m2: m2 }

    return {

    obj: obj
    

    } })(module1 || {});

var module1 = (function(){ var obj = { m1: m1, m2: m2 }

return { obj: obj } })(); ```

问题

当模块依赖另一个模块时,只能是多对一的简单的依赖关系,过于复杂时没法看清