<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> /* *发布订阅模式 * 存在的问题 : * 1 重复的订阅 * 2 发布的信息不是用户本身想要的, * 3 代码结构上的问题, */ var sales={}; // 订阅的对象, sales.cache=[]; // 监听 sales.listen=function (fn) { this.cache.push(fn); } // 发布 sales.trigger = function () { for(var i=0,fn;fn = this.cache[i++];){ fn.apply(this,arguments); } } //test sales.listen(function (s,p) { console.log('sequen+'+s); console.log('price+'+p); }); sales.trigger('200',40); sales.trigger('100',20); </script> </head> <body> </body> </html> // 修正 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> /* * 1 解决订阅信息多发的状况, * * * */ var sales={}; sales.cache={}; /** * 监听的时候给,监听对象分组处理 * */ sales.listen = function (key,fn) { if(!this.cache[key]){ this.cache[key] = []; } this.cache[key].push(fn); }; sales.trigger = function () { var key = Array.prototype.shift.call(arguments); fns = this.cache[key]; if(!fns || fns.length === 0) { return false; } for(var i=0,fn;fn = fns[i++];) { fn.apply(this,arguments); } } // listen sales.listen('s100',function(s,p){ console.log('s100+'+s); console.log('p100+'+p) }) //有订阅,可是没有发布, sales.listen('s200',function(s,p){ console.log('s200+'+s); console.log('p300+'+p) }) sales.trigger('s100',100,20); </script> </head> <body> </body> </html>