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

最简单的缓存对象

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源码笔记——回调对象的更多相关文章

  1. jQuery源码笔记——延迟对象

    提供一种方法来执行一个或多个对象的回调函数, Deferred对象通常表示异步事件. 它是回调对象的拓展运用,在jQuery当中非常依赖回调对象. 一个简单的,只解决成功状态下的缓存实例 functi ...

  2. jQuery源码笔记(一):jQuery的整体结构

    jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...

  3. jQuery 2.0.3 源码分析 回调对象 - Callbacks

    源码API:http://api.jquery.com/jQuery.Callbacks/ jQuery.Callbacks()是在版本1.7中新加入的.它是一个多用途的回调函数列表对象,提供了一种强 ...

  4. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  5. jQuery源码笔记——四

    each()实现 var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context ) ...

  6. jQuery源码笔记——数据缓存

    数据缓存是为了解决内存泄露,他的原理是,当我们将数据存储到一个对象上面,实际上是将所有的数据存到一个单独的数据对象里,而这个对象只提供一个接口,这个接口可以访问自己存在数据对象里自己的数据. 这是一个 ...

  7. jQuery源码笔记——三

    将类数组对象转化为数组对象 javascript中有许多类数组对象,比如HTMLCollection,NodeList,arguments.她们的特点是和数组一样有length属性,并且有0,1,2这 ...

  8. jQuery源码笔记——二

    jQuery选择这样返回对象 var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, con ...

  9. jQuery源码笔记——准备

    将变量局部化 作为一个库首要解决的问题就是防止影响全局的变量.自执行匿名函数可以很好的实现这一点. 传入window,undefiend是将全局变量改为局部变量,根据作用域链访问原理,访问更快一些,. ...

随机推荐

  1. OpenLayers实现覆盖物选择信息提示

    var map; function init() { map = new OpenLayers.Map("map",{projection:"EPSG:3857" ...

  2. hdu 1010 Tempter of the Bone 深搜+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. OpenStack high-level Functionsenabled

  4. C编译器、链接器、加载器详解

    摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...

  5. Makefile里调用Shell注意点

    http://www.linuxidc.com/Linux/2012-04/59093.htm 大家经常编写和使用Makefile, Makefile里面也经常用到shell, 但对其中一些需要注意的 ...

  6. JS属性

    1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码: var a1;var a2 = tr ...

  7. Lining Up(在一条直线上的最大点数目,暴力)

    Lining Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. 【简单项目框架一】Fragment实现的底部导航

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 我所做的项目涉及到比较多的是底部导航,今天我就把项目中使用的一种实现方式分享一下. 主要实现思路是:在一个Activity里面底部添加四个 ...

  9. 集装箱学习(两):动手模拟AOP

    简单的说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 上文已经介绍模拟IoC实现,这篇文章来动手模拟AOP. AOP简述 面向对象强调"一切皆是对象&quo ...

  10. 热烈祝贺Polymer中文组织站点上线

    欢迎来到前端世界的明天 由于官网被墙, 所以 http://docs.polymerchina.org/ 其实是一件很有意义的事. 组件化和重用,一直是编程界几十年来前进的方向和目标,随着时间的推移和 ...