模块化
- 模块内部有独立的命名空间
- 简单划分:变量污染
- 自执行函数,不够灵活
- 独立命名空间,引用非常复杂 ```javascript //设置script的type为module
//引用 模块 import ‘./a.js’; //引入a模块 import {fn} from ‘./a.js’ //引入a模块里边的fn函数
//导出 export let a=10; //导出a=10; export {fn} //导出fn函数 //导出和导入变量名称要对应
export default obj; //导出当前页面boj对象 //obj对应的是export default 导出的内容,{}是export里导出的内容
//通配符接收所有export和export default的内容 inmort* as obj from’./a.js’ //接收a模块里所有的
//懒加载模块 document.querySelector(‘button’).onclick = function(){ //点击按钮再加载模块 import(‘./b.js’).then(res=>{ console.log(res); //提供一个import函数,按需加载 }) }
<a name="bBiDb"></a>
## 异步以及回调
1. js是单线程,同一时刻只干一件事
2. 同步任务依次执行,异步任务不按顺序
<a name="cNw1P"></a>
### 回调地狱
1. 回调函数出现层层嵌套
2. 可读性差,可维护性差
3. 如果有错误,没发定位及捕捉
4. 解决回调地狱的问题 1.观察者模式 2,promise
<a name="FpIOT"></a>
## 观察者模式
```javascript
//两个对象之间,一个对象改变会自动通知给另一个对象,可以是一对多的关系
let btn = document.querySelector("button");
let obj = {
name:"我是obj",
fn(){
console.log("fn");
}
}
let obj2 = {
fn2(){
console.log("fn2");
}
}
btn.addEventListener("click",obj.fn);
btn.addEventListener("click",obj2.fn2);
//点击时,同时响应fn fn2
// 改造成类
// 和自定义事件有关的内容 都在这个类里;
class MyEvent {
constructor() {
this.eventObj = {};
}
addEvent(eventName, fn) {
// 把多个事件名称 和多个事件函数 保存起来
// 第一次绑定的时候 把 事件名初始化成一个数组
if (typeof this.eventObj[eventName] === "undefined") {
this.eventObj[eventName] = [];
}
// 保存事件
this.eventObj[eventName].push(fn);
}
trigger(eventName) {
// 把之前保存的函数 取出来执行就可以了
if (typeof this.eventObj[eventName] !== "undefined") {
this.eventObj[eventName].forEach(fn => {
fn();
})
} else {
throw Error("参数传递错误");
}
}
}
let myevent = new MyEvent();
// 绑定添加事件
myevent.addEvent("myevent",function(){
console.log(1111);
})
myevent.addEvent("myevent",function(){
console.log(2222);
})
// 触发事件
setTimeout(() => {
myevent.trigger("myevent");
}, 2000);