5、bindAsCallBack
本扩展解决以下问题:某些方法在调用时,我们总是希望在延迟一段时间后执行。但我们不希望每次都写setTimeout。而且,在延迟的这段时间内,可能我们又启动了这个延迟方法。此时,我们经常会终止前次延迟。
传统的,我们会这样写:
var delayFunc = function () ... {
if(timeID)clearTimeout(timeID);
// do somthing here.
}
timeID = setTimeout(delayFunc,msec);
bindAsCallBack将这类需求封装起来,由function自身管理延迟、终止等逻辑,并允许多个对象调用该方法,而相互不干扰,并保证this指向正确的对象。
例子:
var obj2 = new Class();
var delayFunc = function (x) ... {
this.x = x;
}
var fun1 = delayFunc.bindAsCallBack(obj1, 1000 );
var fun2 = delayFunc.bindAsCallBack(obj2, 100 );
fun1( 200 );
fun2( 300 );
运行结果是,在1000ms和100ms后,obj1和obj2都增加了一个x属性,并分别被赋值为200和300。
6、doLater
本扩展的使用环境与bindAsCallBack相似,都是用于处理延迟执行的问题。区别在于,bindAsCallBack返回的是一个方法,doLater是运行了该方法。前者更多用于事件处理,后者更多用于延迟调用。
与bindAsCallBack相似,doLater也完成了对延迟、终止和调用对象的管理和封装。在该封装中,我们假定,当调用对象和调用参数相同时,需要终止前次延迟。
例子:
// do something here;
}
delayFunc.doLater(window, 10 );
bindAsCallBack和doLater是使用非常频繁的两个方法。
比如,做过验证器的朋友经常会发现,focus方法经常会“失效”,原因是当你运行focus的时候,浏览器还没有准备好数据,需要延迟执行。这时候,你doLater一下,问题就迎刃而解了。
还有,我们在某个事件(如onmousemove)发生时,需要刷新某个区域,如果没有doLater和bindAsCallBack的终止机制,刷新会不断进行,大大降低了效率。终止机制让连续发生的事件只执行有限的几次。
jscriptFrame大量使用了这些技巧。
7、clearTime
本扩展是doLater的补充,允许设计者在必要的时候终止延迟方法的执行。
8、doNow
本扩展也是对doLater的补充,允许设计者在必要的时候提前执行延迟方法。
clearTime和doNow要求传入正确的调用者和调用参数。当之有调用者没有参数时,会默认终止(提前)该调用者所有的延迟调用。