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

最简单的缓存对象

  1. function Callbacks(){
  2. var list = [],
  3. self = {
  4. add: function(fn){
  5. list.push(fn);
  6. },
  7. remove: function(fn){
  8. var index;
  9. if((index = list.indexOf(fn)) > -1){
  10. list.splice( index, 1 );
  11. }
  12. },
  13. fire: function(value){
  14. for(var i in list){
  15. list[i](value);
  16. }
  17. },
  18. }
  19. return self;
  20. }
  21. var callbacks = Callbacks();
  22. function fn1( value ) {
  23. console.log( value );
  24. }
  25. callbacks.add(fn1);
  26. callbacks.fire( "foo!" );//foo!
  27. callbacks.remove(fn1);
  28. callbacks.fire( "foo!" );//nothing

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

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

once的实现

  1. function Callbacks( options ){
  2. var object = {};
  3. object[options] = true;
  4. options = object;
  5. var list = [],
  6. self = {
  7. add: function(fn){
  8. if ( list ) {
  9. list.push(fn);
  10. }
  11. },
  12. remove: function(fn){
  13. if ( list ) {
  14. var index;
  15. if((index = list.indexOf(fn)) > -1){
  16. list.splice( index, 1 );
  17. }
  18. }
  19. },
  20. fire: function(value){
  21. for(var i in list){
  22. list[i](value);
  23. }
  24. //在Once模式下,当fire过一次后清空回调函数列表。
  25. if( options.once ){
  26. list = undefined;
  27. }
  28. },
  29. }
  30. return self;
  31. }
  32. var callbacks = Callbacks( "once" );
  33. function fn1( value ) {
  34. console.log( value );
  35. }
  36. callbacks.add(fn1);
  37. callbacks.fire( "foo!" );//foo!
  38. callbacks.fire( "foo!" );//nothing

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

memory实现

  1. function Callbacks( options ){
  2. var object = {};
  3. object[options] = true;
  4. options = object;
  5. var list = [],
  6. firingStart = 0,
  7. memory;
  8. self = {
  9. add: function(fn){
  10. if ( list ) {
  11. list.push(fn);
  12. }
  13. //如果存在记忆的参数,则直接调用fire
  14. if( memory ){
  15. self.fire( memory );
  16. }
  17. },
  18. remove: function(fn){
  19. if ( list ) {
  20. var index;
  21. if((index = list.indexOf(fn)) > -1){
  22. list.splice( index, 1 );
  23. }
  24. }
  25. },
  26. fire: function(value){
  27. //保存当前长度
  28. var start = list.length;
  29. for( ; firingStart < list.length;firingStart++){
  30. list[firingStart](value);
  31. }
  32. //在memory模式下,记忆参数,并修改add时调用列表的起始位置。
  33. if( options.memory ){
  34. firingStart = start;
  35. memory = value
  36. }
  37. },
  38. }
  39. return self;
  40. };
  41. function fn1( value ) {
  42. console.log( value );
  43. }
  44. function fn2( value ) {
  45. fn1("fn2 says: " + value);
  46. return false;
  47. }
  48. var callbacks = Callbacks( "memory" );
  49. callbacks.add( fn1 );
  50. callbacks.fire( "foo" );
  51. callbacks.add( fn2 );

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

unique实现

  1. function Callbacks( options ){
  2. var object = {};
  3. object[options] = true;
  4. options = object;
  5. var list = [],
  6. firingStart = 0,
  7. memory;
  8. self = {
  9. add: function(fn){
  10. if ( list ) {
  11. //在unique模式下,当函数已存在,则不添加。
  12. if ( !options.unique || !(list.indexOf(fn) > -1))
  13. list.push(fn);
  14. }
  15. },
  16. remove: function(fn){
  17. if ( list ) {
  18. var index;
  19. if((index = list.indexOf(fn)) > -1){
  20. list.splice( index, 1 );
  21. }
  22. }
  23. },
  24. fire: function(value){
  25. for( ; firingStart < list.length;firingStart++){
  26. list[firingStart](value);
  27. }
  28. },
  29. }
  30. return self;
  31. };
  32. function fn1( value ) {
  33. console.log( value );
  34. }
  35. var callbacks = Callbacks( "unique" );
  36. callbacks.add( fn1 );
  37. callbacks.add( fn1 );
  38. callbacks.fire( "bar" );//bar

主要针对add函数的判断

stopOnFalse的实现

  1. function Callbacks( options ){
  2. var object = {};
  3. object[options] = true;
  4. options = object;
  5. var list = [],
  6. firingStart = 0,
  7. memory;
  8. self = {
  9. add: function(fn){
  10. if ( list ) {
  11. list.push(fn);
  12. }
  13. },
  14. remove: function(fn){
  15. if ( list ) {
  16. var index;
  17. if((index = list.indexOf(fn)) > -1){
  18. list.splice( index, 1 );
  19. }
  20. }
  21. },
  22. fire: function(value){
  23. for( ; firingStart < list.length;firingStart++){
  24. if( !list[firingStart](value) )
  25. break;
  26. }
  27. },
  28. }
  29. return self;
  30. };
  31. function fn1( value ) {
  32. console.log( value );
  33. return false;
  34. }
  35. function fn2( value ){
  36. fn1( "fn2 says: " + value );
  37. return false;
  38. }
  39. var callbacks = Callbacks( );
  40. callbacks.add( fn1 );
  41. callbacks.add( fn2 );
  42. 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. 如何不让oracle使用linux的swap分区

    经常看到swap分区被使用,被缓存的内容本来是为了增加命中率,结果去不断换入换出,导致本地磁盘IO增加,影响访问速度.所以在内存充足的情况下,如果我们觉得不需要使用swap分区的时候,那就要想办法尽量 ...

  2. 2、Lucene 最简单的使用(小例子)

    在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索: 1.下载Lucene 下载Lucene,到Lucene的官 ...

  3. 【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

  4. android笔记1——开发环境的搭建

    Long Long ago...已经成为了历史,我还是要说出一个真相:早年前,那时候,android还不被大众所认知的时候,当然开发人员也没不像如今那样趋于饱和状态.一位大牛前辈,也是我的学长,那时候 ...

  5. Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)

    定制Hortonworks HDP开机启动服务能够这样做:本文原文出处: http://blog.csdn.net/bluishglc/article/details/42109253 严禁不论什么形 ...

  6. 初识动画animation

    工作半年了,基本没怎么用到动画,现在对已学到的动画做一个总结(真的非常非常基础啊啊啊),准备之后再慢慢研究一下动画(有好的教程可以推荐给我咩~~). animation animation:mymov ...

  7. input的样式简介

    <input type="text" autocomplete="off" placeholder="" x-webkit-speec ...

  8. SSH框架中一些技巧、处理办法

    1.使用jstree插件时,操作成功直接刷新jstree 该页面(index.jsp)本身使用iframe框架jstree在leftFrame,操作页(add_input.jsp.add_succes ...

  9. SQL高级查询的练习题

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  10. jQuery绑定事件-多种方式实现

    jQuery绑定事件-多种方式实现: <html> <head> <meta charset="utf-8" /> <script src ...