您的位置:首页 > 其它

对Function的几个有用的扩展(3)

2008-02-11 21:43 337 查看
5、bindAsCallBack

本扩展解决以下问题:某些方法在调用时,我们总是希望在延迟一段时间后执行。但我们不希望每次都写setTimeout。而且,在延迟的这段时间内,可能我们又启动了这个延迟方法。此时,我们经常会终止前次延迟。

传统的,我们会这样写:


var timeID = null




var delayFunc = function()...{


if(timeID)clearTimeout(timeID);


// do somthing here.


}




timeID = setTimeout(delayFunc,msec);

bindAsCallBack将这类需求封装起来,由function自身管理延迟、终止等逻辑,并允许多个对象调用该方法,而相互不干扰,并保证this指向正确的对象。

例子:


var obj1 = new Class();


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也完成了对延迟、终止和调用对象的管理和封装。在该封装中,我们假定,当调用对象和调用参数相同时,需要终止前次延迟。

例子:




var delayFunc = function()...{


// do something here;


}




delayFunc.doLater(window,10);

bindAsCallBack和doLater是使用非常频繁的两个方法。

比如,做过验证器的朋友经常会发现,focus方法经常会“失效”,原因是当你运行focus的时候,浏览器还没有准备好数据,需要延迟执行。这时候,你doLater一下,问题就迎刃而解了。

还有,我们在某个事件(如onmousemove)发生时,需要刷新某个区域,如果没有doLater和bindAsCallBack的终止机制,刷新会不断进行,大大降低了效率。终止机制让连续发生的事件只执行有限的几次。

jscriptFrame大量使用了这些技巧。

7、clearTime

本扩展是doLater的补充,允许设计者在必要的时候终止延迟方法的执行。

8、doNow

本扩展也是对doLater的补充,允许设计者在必要的时候提前执行延迟方法。

clearTime和doNow要求传入正确的调用者和调用参数。当之有调用者没有参数时,会默认终止(提前)该调用者所有的延迟调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: