關(guān)鍵詞:回調(diào)對象
語法:
var call = $.Callbacks('once','memory','unique','stopOnFalse');
參數(shù)
- 'once':只觸發(fā)一次
- 'memory':有記憶功能
- 'unique':去除重發(fā)的添加
- 'stopOnFalse':當函數(shù)return false時候不執(zhí)行
方法
- add();
- remove();
- fire(); 執(zhí)行
例子:
function fn1() {
console.dir("f1")
}
function fn2() {
console.dir("f2")
}
function fn3() {
console.dir("f3")
}
var call = $.Callbacks('once','memory','unique','stopOnFalse');
call.add(fn1);
call.add(fn1);
call.add(fn2);
call.fire(); //
call.add(fn3);
call.remove(fn1);
call.fire(); //
說完了使用方法,那有什么用呢?
function a(){
console.log(1);
}
(function(){
function b(){
console.log(2);
}
call.add(b);
})()
a(); //1
b(); // not defined
和想象的一樣,報錯了,那怎么辦呢,這是個匿名函數(shù),又不能用閉包。
這時候我們可以用延遲對象了
var call = $.Callbacks();
(function(){
function b(){
console.log(2);
}
call.add(b);
})()
a(); //1
// b(); // not defined
call.fire(); //2
沒錯,就這么簡單!
再來一個
setTimeout(function(){
console.log('setTimeout');
},0)
console.log('global');
setTimeout會在global之后打印出來,即使設(shè)為0s也無濟于事,這是js的執(zhí)行順序決定的,那我們現(xiàn)在這樣做:
var call = $.Callbacks();
setTimeout(function(){
console.log('setTimeout');
call.fire();
},1000)
call.add(function () {
console.log('global');
})
這樣我們就可以按照自己想要的順序執(zhí)行了