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 {};
})();