$.Callbacks()
add方法
// 判斷條件
if (!options.unique || !self.has(arg)) {
list.push(arg)
}
// 遞歸
if (arg && arg.length && typeof arg !== "string") {
add(arg)
}
- 判斷條件比較復(fù)雜善于利用邏輯運(yùn)算符
- 當(dāng)要求回調(diào)函數(shù)唯一,使用
self.has檢查,在沒有的情況下添加 - 當(dāng)不要求唯一,直接添加
- 當(dāng)傳入的是數(shù)組或者類數(shù)組(除字符串),要進(jìn)行遞歸
- 在add函數(shù)中,主要邏輯是放在一個(gè)閉包中的
fire相關(guān)方法
和fire相關(guān)的三個(gè)方法,核心相同。jQuery改版
for(;queue.length;firingIndex=-1) {
var memory = queue.shift();
while (++firingIndex < list.length) {
if (list[firingIndex].apply(memory[0],memory[1]) === false && options.stopOnFalse) {
firingIndex = list.length;
memory = false;
}
}
}
-
queue中應(yīng)該存儲(chǔ)的形式如下 -
for并不是死循環(huán),當(dāng)內(nèi)部循環(huán)完畢第一輪,取出queue中第二個(gè)再次從新循環(huán)。結(jié)束條件是queue中數(shù)據(jù)執(zhí)行完畢
var queue = [[context1,[arg1,arg2,arg3]],[context2,[arg1,arg2,arg3]]]
memory參數(shù)的相關(guān)操作
memory現(xiàn)象分析
- 在
$.Callbacks()參數(shù)是memory的情況下
- 最后一次調(diào)用
fire,會(huì)讓memory變量保存最后一次fire的參數(shù) - 在每次
add時(shí),會(huì)檢查memory中是否存儲(chǔ)變量以及是否傳入?yún)?shù)memory
常用參數(shù)分析
- 在
$.ajax()和$.deferred()內(nèi)部實(shí)現(xiàn)中,常用$.Callbacks("memory once") - 其運(yùn)行結(jié)果如下
- 只運(yùn)行一次
- 無論后續(xù)添加
add多少,都運(yùn)行 - 參數(shù)使用第一次傳入的
function f1 (value) {
console.log(value)
}
function f2 (value) {
console.log("f2: " + value)
}
var callbacks = $.Callbacks("once memory");
callbacks.add( f1 );
callbacks.fire( "1" );
callbacks.add( f1 );
callbacks.fire( "2" );
callbacks.add( f1 );
callbacks.fire( "3" );
// 1
// 1
// 1