无论是window.setTimeout还是window.setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要带参数,这就需要想方法解决。经网上查询后整理如下:
例如对于函数hello(_name),它用于针对用户名显示欢
迎信息:
var userName="jack";
//根据用户名显示欢迎信息
function hello(_name){
alert("hello,"+_name);
}
这时,如果企图使用以下语句来使hello函数延迟3秒执行是不可行的:
window.setTimeout(hello(userName),3000);
这将使hello函数立即执行,并将返回值作为调用句柄传递给setTimeout函数,其结果并不是程序需要的。而使用字符串形式可以达到想要的结果:
window.setTimeout("hello(userName)",3000);这是方法(一)
这里的字符串是一段JavaScript代码,其中的userName表示的是变量。但这种写法不够直观,而且有些场合必须使用函数名,于是有人想到了如下
方法(二):
<script language="JavaScript" type="text/javascript">
<!--
var userName="jack";
//根据用户名显示欢迎信息
function hello(_name){
alert("hello,"+_name);
}
//创建一个函数,用于返回一个无参数函数
function _hello(_name){
return function(){
hello(_name);
}
}
window.setTimeout(_hello(userName),3000);
//-->
</script>
这里定义了一个函数_hello,用于接收一个参数,并返回一个不带参数的函数,在这个函数内部使用了外部函数的参数,从而对其调用,不需要使用参数。在 window.setTimeout函数中,使用_hello(userName)来返回一个不带参数的函数句柄,从而实现了参数传递的功能。
另外也有人通过修改settimeout、setInterval来实现。即下面的
方法三:
<script language="JavaScript" type="text/javascript">
<!--
var userName="jack";
//根据用户名显示欢迎信息
function hello(_name){
alert("hello,"+_name);
}//*=============================================================
//* 功能: 修改 window.setInterval ,使之可以传递参数和对象参数
//* 方法: setInterval (回调函数,时间,参数1,,参数n) 参数可为对象:如数组等
//*=============================================================
var __sto = setInterval;
window.setInterval = function(callback,timeout,param){
var args = Array.prototype.slice.call(arguments,2);
var _cb = function(){
callback.apply(null,args);
}
__sto(_cb,timeout);
}
window.setInterval(hello,3000,userName);
//-->
//-------------------------------------------实例二----------------
<body>
<div id="time1">time1</div>
<div id="time2">time2</div>
</body>
<script>
function TimerC(id){
this.id=id;
this.count=0;
this.timer=null;
}
TimerC.prototype.begin=function(count){
this.count=count;
this.show(this)();
this.timer=setInterval(this.show(this),1000);
}
//在这里,当把this传进来以后,传给obj,obj是外部函数的变量,return function是内部函数,
//内部函数可以调用外部函数的变量obj,而且在外部函数已经执行完了后还可调用,所以obj一直有效.
//setInterval(下一秒)执行的函数是这个内部函数,不带参数的.而不是外部函数.不用闭包,只直行一次.
//如果直接把闭包函数写在setInterval里也行,这里可以判断后clearInterval.return function后等于使用此函数了。
TimerC.prototype.show=function(obj){
return function(){
if(obj.count<0){
document.getElementById(obj.id).innerHTML="over";
clearInteval(obj.timer);
return;
}
document.getElementById(obj.id).innerHTML=obj.count;
obj.count--;
}
}
var t2 = new TimerC("time2");
t2.begin(10);
</script>
//----------------------------实例三---------------------------
- function f(){
-
var a = [];
-
var i;
-
for(i=0;i<3;i++){
-
a[i] = function(){
- alert(i);
-
return i;
- }
- }
-
return a;
- }
-
-
var a= f();
-
a[0]();
-
a[1]();
-
a[2]();
- //我们新建了三个闭包,都指向了变量i。闭包并没有记住变量i的值,它仅是变量i的引用。在循环结束后,i的值是3,所以结果都是3
- a[0]是个函数引用,所以后面要加()来执行。
- 也可以写成:
-
a[i] = (function(x){
- alert(x);
-
return x;
- })(这里传参数 i 给x)
- 这样最后的a[0]就不用()了,因为a[i]付的值是return i;
- function f() {
-
var a = [];
-
var i;
-
for(i = 0; i < 3; i++) {
-
a[i] = (function(x){
-
return function(){
- alert(x);
-
return x;
- }
- })(i);
- }
-
return a;
- }
-
-
var a = f();
-
a[0]();
-
a[1]();
-
a[2]();
- //我们又用了一个闭包,把变量i变成了局部变量x了,x变量每次都是不同的值了。如果没有彻底理解自调用函数那就如下写法就可以明白了
function f() {
var a = [];
var i;
for(i = 0; i < 3; i++) {
a[i] = (function(x){
//return function(){
alert(x);
return x;
// }
})(i);
}
return a;
}
var a = f();
//a[0]();//0
//a[1]();//1
//a[2]();//2
这里不用a[0]();a[1]();a[2]();alert(x)在循环时执行.如果alert(a[0])//0,alert(a[0]())报错,提示a[0]不是函数
分享到:
相关推荐
setInterval(code,millisec[,”lang”]) setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。 参数 描述 code 必需,要调用的函数或要执行的代码串。 millisec 必需,周期性执行或调用...
NULL 博文链接:https://dolphin-ygj.iteye.com/blog/517238
在JS中无论是setTimeout还是setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要带参数, 这就需要想方法解决。 一、采用字符串形式:——(缺陷)参数不能被周期性改变 setInterval(“foo(id...
关于JS定时器(setTimeout setInterval)定时不准问题1
setTimeout,javascript 延时执行函数,闭包处理 利用javascript闭包处理延时操作
给c#添加SetTimeout和SetInterval函数.docx
Javascript定时器(二)——setTimeout与setInterval 在 http://www.cnblogs.com/strick/p/3983904.html 有说明
/****************************************************** // // 功能: 修改window.setTimeout,使之可以传递参数和对象参数 // 使用方法: window.setTimeout(回调函数,延迟时间,参数1,参数n) // ******************...
前几天学了js,看到了两个非常有趣的函数,他们分别是setTimeout函数和setInterval函数,这两个函数能使网页呈现非常一些网页中比较常见的效果,比如说图片轮播,等一些非常好玩的效果。下面就来一起来了解这两个...
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。 注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串。 ...
深化理解setTimeout函数和setInterval函数_.docx
本文实例讲述了JavaScript实现向setTimeout执行代码传递参数的方法。分享给大家供大家参考。具体分析如下: setTimeout函数是javascript中实现动态效果最关键的函数。但昨天在写代码的时候发现当第一个参数是函数...
于是,上网查找了一下,用了另一种写法setTimeout(”fun(“+参数+”)”, 1000),还是不行,但是以上写法在传递form表单的textarea是可以的,比如hml是这样: 代码如下: <body> ”main”> ”showpane” class=...
使用SetInterval和设定延时函数setTimeout 很类似。setTimeout 运用在延迟一段时间,再进行某项操作。
Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。 ...
NULL 博文链接:https://rainbow702.iteye.com/blog/1668935
setTimeout()从载入后延迟指定的时间去执行一个表达式或者是函数;仅执行一次 ;和window.clearTimeout一起使用.我在 代码如下:$(document).ready(function(){setTimout(test(),200); function test() { alert(1&#...
JS中的setTimeout和setInterval的区别JS中的setTimeout和setInterval的区别JS中的setTimeout和setInterval的区别