jQuery源碼筆記——回調對象

來源:互聯網
上載者:User

標籤:style   blog   io   color   ar   sp   for   div   on   

回調對象是一個多用途的回調列表對象,提供了強大的的方式來管理回呼函數列表。

最簡單的緩衝對象
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源碼筆記——回調對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.