首页 > 代码库 > jQuery源码笔记——回调对象

jQuery源码笔记——回调对象

回调对象是一个多用途的回调列表对象,提供了强大的的方式来管理回调函数列表。

最简单的缓存对象

function Callbacks(){    var list = [],    self = {        add: function(fn){            list.push(fn);        },        remove: function(fn){            var  index;            if((index = list.indexOf(fn)) > -1){                list.splice( index, 1 );            }        },        fire: function(value){            for(var i in list){                list[i](value);            }        },    }    return self;}var callbacks = Callbacks();function fn1( value ) {    console.log( value );}callbacks.add(fn1);callbacks.fire( "foo!" );//foo!callbacks.remove(fn1);callbacks.fire( "foo!" );//nothing

回调对象是为了将回调函数统一管理,如添加,删除,调用等功能。

 

在jQuery当中,除了实现基本的管理,还提供了由Callbacks参数决定的回调对象的模式。这四个属性有once,memory,unique,stopOnFalse;

once的实现

function Callbacks( options ){    var object = {};    object[options] = true;    options = object;    var list = [],    self = {        add: function(fn){            if ( list ) {                list.push(fn);            }        },        remove: function(fn){            if ( list ) {                var  index;                if((index = list.indexOf(fn)) > -1){                    list.splice( index, 1 );                }            }        },        fire: function(value){            for(var i in list){                list[i](value);            }            //在Once模式下,当fire过一次后清空回调函数列表。            if( options.once ){                list = undefined;            }        },    }    return self;}var callbacks = Callbacks( "once" );function fn1( value ) {    console.log( value );}callbacks.add(fn1);callbacks.fire( "foo!" );//foo!callbacks.fire( "foo!" );//nothing

在once模式下,fire过一次后,清空回调函数列表。

memory实现

function Callbacks( options ){    var object = {};    object[options] = true;    options = object;    var list = [],    firingStart = 0,    memory;    self = {        add: function(fn){            if ( list ) {                list.push(fn);            }            //如果存在记忆的参数,则直接调用fire            if( memory ){                self.fire( memory );            }        },        remove: function(fn){            if ( list ) {                var  index;                if((index = list.indexOf(fn)) > -1){                    list.splice( index, 1 );                }            }        },        fire: function(value){            //保存当前长度            var start = list.length;            for( ; firingStart < list.length;firingStart++){                list[firingStart](value);            }            //在memory模式下,记忆参数,并修改add时调用列表的起始位置。            if( options.memory ){                firingStart = start;                memory = value            }        },    }    return self;};function fn1( value ) {    console.log( value );}function fn2( value ) {    fn1("fn2 says: " + value);    return false;}var callbacks = Callbacks( "memory" );callbacks.add( fn1 );callbacks.fire( "foo" );callbacks.add( fn2 );

在memory下,记忆上次调用的参数,和已经执行了函数的位置,当有新函数add时,直接调用。

unique实现

function Callbacks( options ){    var object = {};    object[options] = true;    options = object;    var list = [],    firingStart = 0,    memory;    self = {        add: function(fn){            if ( list ) {                //在unique模式下,当函数已存在,则不添加。                if ( !options.unique || !(list.indexOf(fn) > -1))                    list.push(fn);            }        },        remove: function(fn){            if ( list ) {                var  index;                if((index = list.indexOf(fn)) > -1){                    list.splice( index, 1 );                }            }        },        fire: function(value){            for( ; firingStart < list.length;firingStart++){                list[firingStart](value);            }        },    }    return self;};function fn1( value ) {    console.log( value );}var callbacks = Callbacks( "unique" );callbacks.add( fn1 ); callbacks.add( fn1 );callbacks.fire( "bar" );//bar

主要针对add函数的判断

stopOnFalse的实现

function Callbacks( options ){    var object = {};    object[options] = true;    options = object;    var list = [],    firingStart = 0,    memory;    self = {        add: function(fn){            if ( list ) {                list.push(fn);            }        },        remove: function(fn){            if ( list ) {                var  index;                if((index = list.indexOf(fn)) > -1){                    list.splice( index, 1 );                }            }        },        fire: function(value){            for( ; firingStart < list.length;firingStart++){                if( !list[firingStart](value) )                    break;            }        },    }    return self;};function fn1( value ) {    console.log( value );    return false;}function fn2( value ){    fn1( "fn2 says: " + value );    return false;}var callbacks = Callbacks( );callbacks.add( fn1 ); callbacks.add( fn2 );callbacks.fire( "bar" );

每次fire判断是否返回的是false,是则停止继续调用。

 

 

jQuery源码笔记——回调对象