Callbacks是jQuery 1.7引入的方法,用于管理一系列使用相同参数的回调函数。所有回调函数(以下简称回调)保存在一个数组中,可以重复调用。其本质相当于一个回调函数列(List),因此可以做添加、删除、清空回调函数等操作。
var callbacks = $.Callbacks();
回调保存在数组中,然后通过for循环遍历,所以列中的回调按照被添加的顺序依次执行,最后添加的一般最后执行。
// Fire the items on the list var foo = function( value ) { console.log( "foo:" + value ); }; // Add another function to the list var bar = function( value ){ console.log( "bar:" + value ); }; var callbacks = $.Callbacks(); callbacks.add( foo ); callbacks.add( bar); callbacks.fire("hello"); // output: foo: hello // output: bar: hello
唯一例外的情况是如果标记是memory,如果之前fire()被调用过,那么新的回调被add()添加之后会立刻使用前一个fire的参数执行一遍。但add()之前被fire()调用过的回调,如果没有使用fire()或fireWith(),不会马上再执行一遍。
标记设置方式举例:
var callbacks = $.Callbacks("once memory");
调用disable()之后,回调函数列就被清空了,此时使用fire或fireWith都不会有任何响应。因此,Callbacks没有提供enable方法,因为所有回调已经被清空了,没有再enable的必要。
有一种情况是在回调中又调用了callbacks的fire()或fireWith(),这种情况该怎么办?jQuery是这样做的:在回调中使用fire()或fireWith(),callbacks只是保存了fire()或fireWith()的参数,并没有立即执行列中的回调。只有当callbacks中的所有回调执行完之后,新的参数才会被callbacks中的回调利用。
function fn1( value ){ console.log( value ); if (value == "bar!") return false; callbacks.fire("bar!"); } function fn2( value ){ console.log( "fn2 says: " + value); } var callbacks =$.Callbacks("stopOnFalse"); callbacks.add( fn1 ); callbacks.add( fn2 ); // Outputs: foo! // Outputs: fn2 says:foo! // Outputs: bar! callbacks.fire("foo!" );
回调列被锁死,再调用callbacks.fire()或callbacks.fireWith()都将失效。
如果是在回调中调用了callbacks.lock(),则有一点需要注意:
奇怪的是Callbacks没有提供unlock方法,也就是说,一旦被locked,Callbacks就永久失去了调用fire()或fireWith()的能力。
原文地址:http://blog.csdn.net/woxueliuyun/article/details/46124477