<!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>