模块化
- 模块内部有独立的命名空间
- 简单划分:变量污染
- 自执行函数,不够灵活
- 独立命名空间,引用非常复杂 ```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);
