zoukankan      html  css  js  c++  java
  • 张静宜对订阅-发布模式的理解

    var Event = (function(){
     var global = this,
     Event,
     _default = 'default';
     Event = function(){
     var _listen,
     _trigger,
     _remove,
     _slice = Array.prototype.slice,
     _shift = Array.prototype.shift,
     _unshift = Array.prototype.unshift,
     namespaceCache = {},
     _create,
     find,
     each = function( ary, fn ){
     var ret;
     for ( var i = 0, l = ary.length; i < l; i++ ){ 
    var n = ary[i];
     ret = fn.call( n, i, n);
     }
     return ret;
     };
     _listen = function( key, fn, cache ){
     if ( !cache[ key ] ){
     cache[ key ] = [];
     }
     cache[key].push( fn );
     };
     _remove = function( key, cache ,fn){
     if ( cache[ key ] ){
     if( fn ){
     for( var i = cache[ key ].length; i >= 0; i-- ){
     if( cache[ key ][i] === fn ){
     cache[ key ].splice( i, 1 );
     }
     }
     }else{
     cache[ key ] = [];
     }
     }
     };
     _trigger = function(){
     var cache = _shift.call(arguments),
     key = _shift.call(arguments),
     args = arguments,
     _self = this,
     ret,
     stack = cache[ key ];
     if ( !stack || !stack.length ){
     return;
     }
     return each( stack, function(){
     return this.apply( _self, args );
     });
     };
     _create = function( namespace ){
     var namespace = namespace || _default;
     var cache = {},
     offlineStack = [], // 离线事件
     ret = {
     listen: function( key, fn, last ){
     _listen( key, fn, cache );
     if ( offlineStack === null ){
     return;
     }
     if ( last === 'last' ){ 
    offlineStack.length && offlineStack.pop()();
     }else{
     each( offlineStack, function(){
     this();
     });
     }
     offlineStack = null;
     },
     one: function( key, fn, last ){
     _remove( key, cache );
     this.listen( key, fn ,last );
     },
     remove: function( key, fn ){
     _remove( key, cache ,fn);
     },
     trigger: function(){
     var fn,
     args,
     _self = this;
     _unshift.call( arguments, cache );
     args = arguments;
     fn = function(){
     return _trigger.apply( _self, args );
     };
     if ( offlineStack ){
     return offlineStack.push( fn );
     }
     return fn();
     }
     };
     return namespace ?
     ( namespaceCache[ namespace ] ? namespaceCache[ namespace ] :
     namespaceCache[ namespace ] = ret )
     : ret;
     };
     return {
     create: _create,
     one: function( key,fn, last ){
     var event = this.create( );
     event.one( key,fn,last );
     },
     remove: function( key,fn ){
     var event = this.create( );
     event.remove( key,fn );
     },
     listen: function( key, fn, last ){
     var event = this.create( );
     event.listen( key, fn, last );
     },
     trigger: function(){ 
    var event = this.create( );
     event.trigger.apply( this, arguments );
     }
     };
     }();
     return Event;
    })(); 
  • 相关阅读:
    mysql u root p 等这些常用的参数
    关于类对象大小的 sizeof 计算问题
    sql like用法
    链表队列
    Zend Studio安装教程
    #define和inline 的区别
    ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)
    Ubuntu 10.04下LAMP环境的配置与使用教程
    win7保护视力的电脑设置
    sql between and 用法
  • 原文地址:https://www.cnblogs.com/Jm-jing/p/6914361.html
Copyright © 2011-2022 走看看