7.JS高阶编程-闭包(单例模式)

95 阅读2分钟

闭包应用

  • 模块化思想
  • 惰性函数
  • 柯里化函数
    • 高阶组件 -》 react
    • 函数防抖和节流
    • bind
    • ...
  • compose组合函数
  • ...

模块化思想

单例-》AMD(require.js)->CMD(sea.js)->CommoneJs(Node)->ES6Module

在没有模块化思想之前,团队协作开发或者代码量较多的情况,会导致全局变量污染「全局变量冲突」

/**
 * 
 */

// 实现天气板块
var tim = '2020-11-01'
function queryData() {
  // ...
}
function changeCity() {

}
// 实现资讯版块
var tim = '2020-10-31'
function changeCity() {
  // ...
}

暂时基于闭包的“保护作用”防止全局变量污染「但是因为每个版块的代码都是私有的,无法相互调用」

// 实现天气板块
(function () {
  var tim = '2020-11-01'
  function queryData() { }
  function changeCity() { }
})();

// 实现资讯版块
(function () {
  var tim = '2020-10-31'
  function changeCity() { }
})();

基于某些方法去实现相互调用

// 实现天气板块
(function () {
  var tim = '2020-11-01'
  function queryData() { }
  function changeCity() { }
  // 把需要供别人调用API方法,挂到全局上「不能挂载太多,挂载多了,还是会引发全局变量的污染」
  window.queryData = queryData
})();

// 实现资讯版块
(function () {
  var tim = '2020-10-31'
  function queryData() { }
  queryData()
})();

高级单例设计模式:闭包+单例的结合,也是最早期的JS模块化思想

/**
 * 单例对象
 */
// // 对象的特点:每个对象都是一个单独的堆内存空间(单独的实例-》object),这样即使多个对象中的成员名字相同,也互不影响
// // 仿照其他后台语言,其实obj1/obj2不仅仅称为对象名,更被称为“命名空间「给堆内存空间起一个名字」”
// // ---> 每一个对象都是一个单独的实例,用来管理自己的私有信息,即使名字相同,也互不影响,其实这就是“JS中的单例模式”
// var obj1 = {
//   name: 'zf',
//   age: 12,
//   fn: function () { }
// };
// var obj1 = {
//   name: 'zhouxt',
//   age: 30,
//   fn: function () { }
// };

/**
 * 闭包+单例
 */
// 实现天气板块
var weatherModule = (function () {
  var tim = '2020-11-01'
  function queryData() { }
  function changeCity() { }
  infoModule.changeCity()
  return {
    queryData,
    changeCity,
  }
})();

// 实现资讯版块
var infoModule = (function () {
  var tim = '2020-10-31'
  function changeCity() { }
  weatherModule.queryData()
  return {
    changeCity,
  }
})();

var skinModule = (function () {
  // 
  return {}
})()