作用域闭包:模块模式

 模块模式需要具备两个必要条件
 1.必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)
 2.封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或则和修改私有状态
一个具有函数属性的对象本身并不是真正的模块.从方便观察的角度看,一个从函数所返回的,只有数据属性而没有闭包函数的对象并不是真正的模块
function CoolModule(){
  var something = "cool";
  var another = [1,2,3];
  function doSomething(){
    console.log(something);
  }
  function doAnother(){
    console.log(another.join("!"));
  }
  return{
    doSomething:doSomething,
    doAnother:doAnother
  }
}
var foo = CoolModule();
foo.doSomething(); //cool
foo.doAnother() //1!2!3

  这个模式在JavaScript中被称为模块.最澄减的实现魔窟开模式的方法通常被称为模块暴露,这里展示的是其变体,模块模式另一个简单但强大的变化用法是,命名将要作为公共API返回的对象:

var foo = (function CoolModule(id){
    function change(){
      // 修改公共API
      publicAPI.identify = identify2
    }
    function identify1(){
      console.log(id);
    }
    function identify2(){
      console.log(id.toUpperCase());
    }
    var publicAPI = {
      change:change,
      identify:identify1
    }
    return publicAPI;
})("foo Module");

foo.identify()   //foo Module
foo.change()
foo.identify()   //FOO MODULE

  通过在模块实例的内部保留对公共API对象的内部引用,可以从内部对模块实例进行修改,包括添加或删除方法和属性,以及修改它们的值

posted @ 2020-01-02 14:37  KIU的博客  阅读(185)  评论(0编辑  收藏  举报