巧用apply让javascript函数仅执行一次


RT,有时候我们只想要让某些脚步函数执行一次就算完成任务了。如何实现这种功能呢?简单模仿下面这段就可以轻松搞定了:

代码
varobj=newObject();

obj.triggerOnce
=function(fn){//控制让函数只触发一次
returnfunction(){
try{
fn.apply(
this,arguments);
}
catch(e){
vartxt="Therewasanerroronthispage.\n\n";
txt
+="Errormessage:"+e.message+"\n\n";
txt
+="Errorname:"+e.name+"\n\n";
//alert(txt);//正式平台上可能需要注释掉该行
}
finally{
fn
=null;
}
}
}

调用形式:


functionshowMsg(arg){
alert(arg);
}

varfn=obj.triggerOnce(showMsg);
fn(
1);//只执行一次
fn(2);//没有调用fn

最后,关于javascript的apply方法,您可以简单参考这篇旧文。


外一篇】用javascript取得querystring的值
在常见的网站中,经常碰到有“XXXX.aspx?username=jeffwong&address=北京” 这种形式的url,通过asp.net的Request对象获取键值轻而易举,通过js也不是很难,用下面的函数就可以搞定了:

代码
varurlStrs=location.search;//QueryString
varRequest={};
Request.Count
=0;

Request.Add
=function(name,value){
if(Request.hasOwnProperty(name)==false){
Request.Count
++;//如果不存在,计数添加1
}
Request[name]
=value;
returntrue;
}

Request.QueryString
=function(name){//取对应的键值
varkey=name.toString().toLocaleLowerCase();//不区分大小写
varresult=null;
try{
//if(Request.hasOwnProperty(key)){
result=Request[key];
//}
}
catch(e){
//alert(e.message);
}
returnresult;
}

Request.Init
=function(urlQueryString){
if(urlQueryString.indexOf("?")!=-1){
varurl=urlQueryString.substr(1)
varstrArr=url.split("&");
for(vari=0;i<strArr.length;i++){
varstrChildArr=strArr[i].split("=");
varname=String(strChildArr[0]).toLowerCase();
varvalue=unescape(strChildArr[1]);//unescape解码
this.Add(name,value);//添加
}
}
}
测试函数如下:
代码
//测试函数
functiontest(){
Request.Init(urlStrs);
//初始化request
alert(Request.Count);
varname="username";
varvalue=Request.QueryString(name);
alert(Request[name]);
alert(Request.QueryString(name));

name
="address"
alert(Request[name]);
alert(Request.QueryString(name));

name
="age";
alert(Request[name]);
alert(Request.QueryString(name));
}

需要说明的是,url里的参数通常都会有编码,本文采用的是比较常用的unescape进行解码,实际上,关于url参数编码,通常有escape,encodeURIComponent和encodeURI这三种编码函数,escape是window对象的内置函数,而另外两种则是javascript内置函数,它们解码的函数也是一一对应的关系(您可以参考这一篇),各自对应的反转函数分别是unescape,decodeURIComponent和decodeURI。

优质内容筛选与推荐>>
1、getCurrrentSession和openSession的区别,还有getHiberanteTemplate
2、QListWidget加入小控件
3、设计模式(六) 桥梁模式
4、输入结束快捷键
5、典型漏洞归纳之解析漏洞


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn