对Function的几个有用的扩展(3)
2008-02-11 21:43
337 查看
5、bindAsCallBack
本扩展解决以下问题:某些方法在调用时,我们总是希望在延迟一段时间后执行。但我们不希望每次都写setTimeout。而且,在延迟的这段时间内,可能我们又启动了这个延迟方法。此时,我们经常会终止前次延迟。
传统的,我们会这样写:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var timeID = null
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
var delayFunc = function()...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(timeID)clearTimeout(timeID);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// do somthing here.
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
timeID = setTimeout(delayFunc,msec);
bindAsCallBack将这类需求封装起来,由function自身管理延迟、终止等逻辑,并允许多个对象调用该方法,而相互不干扰,并保证this指向正确的对象。
例子:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var obj1 = new Class();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var obj2 = new Class();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
var delayFunc = function(x)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
this.x = x;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var fun1 = delayFunc.bindAsCallBack(obj1,1000);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var fun2 = delayFunc.bindAsCallBack(obj2,100);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
fun1(200);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
fun2(300);
运行结果是,在1000ms和100ms后,obj1和obj2都增加了一个x属性,并分别被赋值为200和300。
6、doLater
本扩展的使用环境与bindAsCallBack相似,都是用于处理延迟执行的问题。区别在于,bindAsCallBack返回的是一个方法,doLater是运行了该方法。前者更多用于事件处理,后者更多用于延迟调用。
与bindAsCallBack相似,doLater也完成了对延迟、终止和调用对象的管理和封装。在该封装中,我们假定,当调用对象和调用参数相同时,需要终止前次延迟。
例子:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
var delayFunc = function()...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// do something here;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
delayFunc.doLater(window,10);
bindAsCallBack和doLater是使用非常频繁的两个方法。
比如,做过验证器的朋友经常会发现,focus方法经常会“失效”,原因是当你运行focus的时候,浏览器还没有准备好数据,需要延迟执行。这时候,你doLater一下,问题就迎刃而解了。
还有,我们在某个事件(如onmousemove)发生时,需要刷新某个区域,如果没有doLater和bindAsCallBack的终止机制,刷新会不断进行,大大降低了效率。终止机制让连续发生的事件只执行有限的几次。
jscriptFrame大量使用了这些技巧。
7、clearTime
本扩展是doLater的补充,允许设计者在必要的时候终止延迟方法的执行。
8、doNow
本扩展也是对doLater的补充,允许设计者在必要的时候提前执行延迟方法。
clearTime和doNow要求传入正确的调用者和调用参数。当之有调用者没有参数时,会默认终止(提前)该调用者所有的延迟调用。
本扩展解决以下问题:某些方法在调用时,我们总是希望在延迟一段时间后执行。但我们不希望每次都写setTimeout。而且,在延迟的这段时间内,可能我们又启动了这个延迟方法。此时,我们经常会终止前次延迟。
传统的,我们会这样写:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var timeID = null
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
var delayFunc = function()...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(timeID)clearTimeout(timeID);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// do somthing here.
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
timeID = setTimeout(delayFunc,msec);
bindAsCallBack将这类需求封装起来,由function自身管理延迟、终止等逻辑,并允许多个对象调用该方法,而相互不干扰,并保证this指向正确的对象。
例子:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var obj1 = new Class();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var obj2 = new Class();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
var delayFunc = function(x)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
this.x = x;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var fun1 = delayFunc.bindAsCallBack(obj1,1000);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
var fun2 = delayFunc.bindAsCallBack(obj2,100);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
fun1(200);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
fun2(300);
运行结果是,在1000ms和100ms后,obj1和obj2都增加了一个x属性,并分别被赋值为200和300。
6、doLater
本扩展的使用环境与bindAsCallBack相似,都是用于处理延迟执行的问题。区别在于,bindAsCallBack返回的是一个方法,doLater是运行了该方法。前者更多用于事件处理,后者更多用于延迟调用。
与bindAsCallBack相似,doLater也完成了对延迟、终止和调用对象的管理和封装。在该封装中,我们假定,当调用对象和调用参数相同时,需要终止前次延迟。
例子:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
var delayFunc = function()...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// do something here;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
delayFunc.doLater(window,10);
bindAsCallBack和doLater是使用非常频繁的两个方法。
比如,做过验证器的朋友经常会发现,focus方法经常会“失效”,原因是当你运行focus的时候,浏览器还没有准备好数据,需要延迟执行。这时候,你doLater一下,问题就迎刃而解了。
还有,我们在某个事件(如onmousemove)发生时,需要刷新某个区域,如果没有doLater和bindAsCallBack的终止机制,刷新会不断进行,大大降低了效率。终止机制让连续发生的事件只执行有限的几次。
jscriptFrame大量使用了这些技巧。
7、clearTime
本扩展是doLater的补充,允许设计者在必要的时候终止延迟方法的执行。
8、doNow
本扩展也是对doLater的补充,允许设计者在必要的时候提前执行延迟方法。
clearTime和doNow要求传入正确的调用者和调用参数。当之有调用者没有参数时,会默认终止(提前)该调用者所有的延迟调用。
相关文章推荐
- 对Function的几个有用的扩展(2)
- 对Function的几个有用的扩展:jscriptFrame(3)
- 对Number的几个有用的扩展:jscriptFrame(4)
- 有关string和Cookie的几个有用的扩展方法
- 几个有用的ASP Function
- sql server中扩展存储过程随笔(几个有用的PROCEDURE小总结)
- sqlserver中扩展存储过程随笔(几个有用的PROCEDURE小总结)
- sql server中扩展存储过程随笔(几个有用的PROCEDURE小总结)
- 记录一下Hash长度扩展攻击的几个题目
- c++ 编程 几个有用的宏详解
- 几个有用的MSSQL语句
- 几个有用的dotnet工具和控件
- 几个有用的谷歌Chrome插件
- 几个有用的Windows Mobile相关方法
- 有用的String的扩展
- spring mvc 提供的几个常用的扩展点
- php几个常见扩展的安装使用
- java对文件名的几个操作,获取文件扩展名,去掉扩展名
- extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。
- 几个有用的SAP安全配置的用户参数配置列表