[JS]11.闭包应用(单例模式)

380 阅读2分钟

1. 基于闭包实现早期的模块化思想

  • 单例设计模式(模块化概念)
  • AMD => require.js
  • CMD => sea.js
  • CommonJS => Node本身就是基于这种规范实现
  • ES6 Module
- 没有对象,描述基本信息,需重复创建相同信息
- 在没有对象类型值之前,很容易产生全局变量污染
let name = 'paul';
let age = 22;
let money = false;

let name = 'anthney';
let age = 25;
let money = true;

2. 解决冲突

2.1 利用闭包的保护机制

  • 弊端:不暴露全局不能互相访问,暴露太多也容易冲突
- 每一个都是一个堆内存,独立
(function() {
  let name = 'paul';
  let age = 22;
  let money = false;
  const skill = function() {}
  const skill2 = function() {}
  
  // 暴露全局
  window.skill2 = skill2;
})();

(function() {
  let name = 'anthney';
  let age = 25;
  let money = true;
  skill();  // skill上面私有的报错
  window.skill2();  // 可以
  skill2(); // 可以
})();

2.2 用对象解决冲突

  • 对象在这里起到一个分组作用
  • 新称呼:person1/person2 命名空间,此处相当于把描述同一个事物得属性,存放到相同的命名空间下,以此来减少全局变量的污染
  • 每一个对象都是Object这个类的一个实例,person1/person2是两个完全不同的实例,所以可以把这种方式称之为单例模式,单独实例
  • new XXX => 构造函数模式
let person1 = {
  let name = 'paul';
  let age = 22;
  let money = false;
  const skill = function() {}
}
let person2 = {
    let name = 'anthney';
  let age = 25;
  let money = true;
  person1.skill();  // 可以
}

3. 单例模式

  • 高级单例设计模式:JS中最早期的模块化开发思想模块之间独立性以及互通性

    • 把一个复杂或者大型的产品,按照功能特点,拆分成一个个模块
    • 每个模块都是独立的,相互之间的信息都是互不干扰
    • 对于一些需要供其它模块用到的公共方法,我们是可以实现相互调用
  • a baidu demo

    • 全局变量互相干扰
/*
  leader -> 公共方法
*/

let isWindoow = true;
    num = 0;
// 快速获取元素,匿名函数具名化
const queryElement = function queryElement(selector) {

}
const formatTime = function formatTime(time) {

}


/*
  coderA -> 搜索功能
*/
let num = 10;
const checkValue = function checkValue() {}
const submit = function submit() {}


/*
  coderB -> 换肤功能
*/
let num = 0;
const submit = function submit() {}

  • 用闭包包起来, 实现独立性

/*
  leader -> 公共方法
*/

(function() {
  let isWindoow = true;
      num = 0;
  const queryElement = function queryElement(selector) {}
  const formatTime = function formatTime(time) {}
})();

/*
  coderA -> 搜索功能
*/
(function() {
  let num = 10;
  const checkValue = function checkValue() {}
  const submit = function submit() {}
})();


/*
  coderB -> 换肤功能
*/
(function() {
  let num = 0;
  const submit = function submit() {}
})();
  • 相互之间不能调用,实现互通性
    • 每个模块都是一个闭包,存储自己私有的变量和方法
/*
  leader -> 公共方法
*/

let utils = (function() {
  let isWindoow = true;
      num = 0;
  const queryElement = function queryElement(selector) {}
  const formatTime = function formatTime(time) {}
  // 把需要供外面调用的方法存储到一个命名空间下(对象)
  return {
    queryElement,
    formatTime
  }
})();

/*
  coderA -> 搜索功能
*/
let searchModal = (function() {
  let num = 10;
  const checkValue = function checkValue() {
    // 访问
    utils.formatTime();
  }
  const submit = function submit() {}
  
  return {
    checkValue
  };
})();


/*
  coderB -> 换肤功能
*/
let skinMoadl = (function() {
  let num = 0;
  const submit = function submit() {
    searchModal.checkValue();
  }
  return {};
})();