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

 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要求传入正确的调用者和调用参数。当之有调用者没有参数时,会默认终止(提前)该调用者所有的延迟调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值