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

最简单的缓存对象

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. linux之SQL语句简明教程---CREATE TABLE

    表格是数据库中储存资料的基本架构.在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格.虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格 ...

  2. win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法

    win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题.取消安装.”处理方法 vs2008试用期到期,卸载.重新安装都会出现“ 加载安装组件时遇到问题.取消安装.”无 ...

  3. The 5th tip of DB Query Analyzer

    The 5th tip of DB Query Analyzer             Ma Genfeng   (Guangdong UnitollServices incorporated, G ...

  4. 卓尼斯ZT-180评測

    卓尼斯ZT-180评測    ——正在出差途中,用10”上网本发帖,没有拍照,且写得冲忙,不妥之处见谅. 一.採购 1.因外出旅游,不想带那台14"笔记本,所以想买一台平板电脑.当时,选择的 ...

  5. 【枚举+小技巧】【TOJ4115】【Find the number】

    题目大意 找到一个最小的奇数 约数个数为n 结果mod10^9+7 根据 约数个数=(p1+1)*(p2+1)............ 将n 枚举分解成连乘式.(枚举个数,dfs) 比较大小 log ...

  6. T-SQL事务

    事务 订火车票的时候,下一个订单,这个订单中,包含多个购买信息,要么全部执行,要么全部不执行,合作事务就是来处理这种模型的一种机制. --关键字:transaction 或 tran 简写形式 --开 ...

  7. uilable 换行标记

    m_tipLabel.lineBreakMode = UILineBreakModeWordWrap; m_tipLabel.numberOfLines = 0; m_tipLabel.text =  ...

  8. c# 委托 delegate

    委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...

  9. 一个Socket连接管理池(心跳机制)

    一个Socket连接管理池(心跳机制) http://cuisuqiang.iteye.com/blog/1489661

  10. linux 中ls命令函数

    #include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h> ...