setTimeout 传参

摘要:
而直接像下面这样使用,你应该会发现,是行不通的:code12345678functionfun2{//dosomethinghere;}//注意,这样是会报错的//setTimeout;//在Chrome下面得到的错误是:UncaughtSyntaxError:Unexpectedidentifier,但是有的时候能运行//这中情况对于在Chrome下的调试是非常的隐晦的。这个方法最大的问题是对原生的setTimeout进行了覆盖,如果代码中原有调用了setTimeout,可能就会出现不必要的麻烦了。

http://blog.useasp.net/archive/2012/11/03/the-problem-when-setTimeout-invoke-a-function-with-an-object-parameter.aspx

在javascript中调用setTimeout的时候,如果我们是无参数的方法,调用相对简单,直接像下面这样调用就可以了

code
1
2
3
4
5
6
7
8
9
10
11
12
functionfun(){
// do something here.
}
// 第一个方法
setTimeout(fun(), 100);
// 第二个方法
setTimeout(fun, 100);
// 第三个方法
setTimeout("fun()", 100);

在有参数的时候,如果仅仅是字符串类型,也还好解决,第三种方法为我们提供了依据,可以像下面这样:

code
1
2
3
4
5
6
7
8
9
10
11
functionfun1(p){
// do something here;
}
// 注意这里有两个方法
// No.1:将参数写死,直接调用
setTimeout("fun1('parameters')", 100);
//No. 2: 在程序中如果要动态的调用,则可以使用组合参数的形式
setTimeout("fun1('"+ paramenter +"')", 100);
//注意,这里需要单引号。

不过事情并非总是如此顺利,我们有的时候需要传递的是对象(这个需求越来越普遍了)。如果是按照这种传参的方式,结果将不可能是我们想要的。而直接像下面这样使用,你应该会发现,是行不通的:

code
1
2
3
4
5
6
7
8
functionfun2(objectP){
// do something here;
}
// 注意,这样是会报错的
// setTimeout(fun2(obj), 100);
// 在Chrome下面得到的错误是:Uncaught SyntaxError: Unexpected identifier,但是有的时候能运行<br>//这中情况对于在Chrome下的调试是非常的隐晦的。
// BTW:你可以试试在IE下面的报错是怎么样的~

为了能够顺利调用,我们要做一些工作,最简单直接的就是重写setTimeout了,霸王硬上弓:

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
functionfun2(objectP){
// do something here;
}
var$st = window.setTimeout;
// 这里覆盖了setTimeout方法,如果需要原始方法的时候,可以使用$st
window.setTimeout =function(funRef, delayTime) {
if(typeoffunRef ==='function') {
varargs = Array.prototype.slice.call(arguments,2);
varf =function(){ funRef.apply(null, args); };// 返回无参数方法
return$st(f, delayTime);//调用无参数方法
}
return$st(funRef,delayTime);
}

在代码中我们能看到,为了后继可以使用原生的setTimeout,我们不得不将setTimeout放入到变量中,这样就可以在有必要的时候调用了。这个方法最大的问题是对原生的setTimeout进行了覆盖,如果代码中原有调用了setTimeout,可能就会出现不必要的麻烦了。为此我们需要一种更简单,并且能够更加容易维护的方法。

分析这个方法,最根本就是让setTimeout调用个无参数的方法,因此,我们可以这样:

code
1
2
3
4
5
6
7
8
9
10
// 对方法进行改进
functionfun2(objectP){
returnfunction(){
// do something here;
// do(objectP);
}
}
// 调用
setTimeout(fun2(p), 100);

这样,就可以直接在setTimeout中调用了。这样就不会和现有的代码产生冲突,并且,在维护的时候,也能更加的方便。

免责声明:文章转载自《setTimeout 传参》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇css实现平行四边形、菱形图片效果解惑:对SQL Server分区进行合并(删除)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

彻底理解setTimeout()

  之前在网上看了很多关于setTimeout的文章,但我感觉都只是点到为止,并没有较深入的去剖析,也可能是我脑袋瓜笨,不容易被点解。后面看了《你不知道的javascript-上卷》一书,决定重新再来理一次。这次我觉得我应该整明白了。于是分享给大家,文中解释有错误的部分还希望大家留言指正。 首先我们还是来看那道大家再熟悉不过的前端面试题: for (va...

vue中通过WeixinJSBridge关闭微信公众号当前页面,返回微信公众号首页

之前有个需求,点击菜单进入到微信公众号模块,然后点击返回的时候不知道到哪里去,后来觉得点返回的时候直接关闭页面,但是window.close()并不能关闭页面,然后经过查找资料,发现通过以下方法可以 setTimeout(function() { //这个可以关闭安卓系统的手机 document.addEventListener( "Wei...

for循环中的闭包

1.代码 for(i=0;i<3;i++){ setTimeout(function(){ console.log(i); },0) } 输出为: 2.代码(闭包,直接执行匿名函数) for (var i = 0; i < 3; i++) { (function(x){ s...

setTimeout与setInterval实战之定时刷新

仍然是上次的考试系统中在考生界面那一栏需要实现定时刷新,以保证信息的及时反馈,当时也没有什么好的实现方式,就使用了ajax+setTimeout来实现了, 先来说下setTimeout与setInterval的使用与区别: 使用:就是直接在js中调用这两个方法就可以了,这是window对象有两个主要的定时方法,表达式粉分别为 setTimeout (表达式...

Node.js 事件循环

本文地址 http://www.cnblogs.com/jasonxuli/p/6074231.html   原文:https://github.com/nodejs/node/blob/master/doc/topics/event-loop-timers-and-nexttick.md     >>> 文末有简单总结       什...

JS异步编程

1.1 什么是异步 异步(async)是相对于同步(sync)而言的,很好理解。 同步就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。而异步是不用等待前一个任务执行完成也能够执行 比如: setTimeout(function(){ console.log(1); }, 1000); console.log(2);// 2...