无论是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){ returnfunction(){ 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]();//3 a[1]();//3 a[2]();//3
- //我们新建了三个闭包,都指向了变量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]();//0 a[1]();//1 a[2]();//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 <script type="text/javascript"> function refreshImgTimeout(){ return function(){ setInterval(refreshImgInteval,2000); } } var refreshImgInteval=function(){ var src="spectrum!spectrumImage.action?" + Math.random(); $("#spectrumImg").attr("src",src); } $(function(){ setTimeout(refreshImgTimeout(),2000); }); </script>
这里不用a[0]();a[1]();a[2]();alert(x)在循环时执行.如果alert(a[0])//0,alert(a[0]())报错,提示a[0]不是函数
相关推荐
在JavaScript编程中,window对象下的setTimeout和setInterval是两个非常重要的...总之,理解并正确使用setTimeout和setInterval,尤其是掌握它们在参数传递方面的问题和解决方法,是前端开发人员必须具备的技能之一。
JavaScript 中 setTimeout 和 ...使用闭包可以正确地传递参数,避免出现意外的结果。同时,需要注意函数的调用方式,例如 `setTimeout(auto, 4000)` 和 `setInterval(auto, 4000)`,这两种方式都是正确的调用方式。
首先,让我们看一个简单的例子,这个例子展示了在不使用自执行匿名函数时遇到的问题: ```javascript function f1() { for (var i = 0; i ; i++) { setTimeout(function() { alert(i); }, 1000); } } f1(); ``...
这是JavaScript中非常强大且灵活的一个特性,因为它允许函数“携带”数据,而无需将数据作为参数传递。 ### 闭包的实现与理解 闭包的概念可能对初学者来说有些难以理解,因为它涉及到作用域、内存管理以及函数执行...
在使用setTimeout和setInterval时,我们常常需要传递参数给将要执行的函数。但在JavaScript中,如何向setTimeout和setInterval传递参数呢?我们首先要了解,这两个函数是把要执行的代码插入到JavaScript引擎维护的一...
通过查看和分析`main.js`的代码,我们可以更具体地解决其中的问题,或者学习如何正确使用`setInterval()`。`README.txt`文件可能提供了关于`main.js`的说明或者使用指导。 总的来说,理解和掌握`setInterval()`的...
在JavaScript编程中,`setTimeout`函数是实现定时任务的一种常用方法。而闭包(Closure)是JavaScript的一个重要概念...通过这些知识点,我们可以在不使用`setInterval`的情况下,依次定时执行函数,并输出预期的结果。
在IE浏览器中,`setInterval` 同样存在不支持函数参数传递的问题。这意味着,如果尝试通过 `setInterval` 传递参数给函数,则函数内部同样无法获取这些参数。 ##### 解决方案 解决 `setInterval` 的兼容性问题的...
在JavaScript编程中,"js代码-定时器闭包传参"这一主题涉及到两个核心概念:定时器(Timer)和闭包(Closure),以及如何通过它们传递参数。在JavaScript中,定时器是通过`setTimeout`或`setInterval`函数实现的,...
然而,一个常见的问题是在尝试使用`setTimeout()`调用带参数的函数时,参数往往无法正确传递。这是因为`setTimeout()`默认只接受一个函数引用和一个延迟时间作为参数,而不直接支持传递额外的参数。这个问题可以通过...
如果将一个对象作为参数传递给闭包,那么闭包所引用的对象将是原始对象的引用,而非对象的副本。这意味着,如果闭包内部函数修改了对象的属性,那么这个对象的所有引用都将反映这一改变。 闭包的用途十分广泛,包括...
IE的实现允许传递三个参数,其中第三个参数用于指定脚本语言类型,而其他浏览器可能将所有额外的参数都作为函数调用的参数传递。 在实践中,推荐使用函数对象而不是字符串形式来调用`setTimeout`,因为这样可以避免...
为了解决这个问题,可以使用闭包保存对当前`this`的引用,如下所示: ```javascript function shape(name) { this.name = name; this.timer = function(){alert('my shape is '+this.name)}; var _this = this; ...
总结一下,`setInterval`和`setTimeout`中的`this`问题可以通过保存`this`的引用或者使用`bind`方法来解决。理解这一点对于编写复杂的JavaScript代码至关重要,特别是在涉及对象方法和异步操作时。
为了解决这个问题,可以使用闭包来创建一个新的作用域,确保每个函数都有自己的`i`副本。这可以通过立即执行函数表达式(IIFE)实现,如第二个例子所示: ```javascript (function(num) { spans2[i].onclick = ...
下面是一个具体的例子,演示了如何使用setInterval和setTimeout,以及如何传递参数: ``` // 循环执行,每隔3秒钟执行一次showalert(),showalert()函数接收一个参数 var timeId = window.setInterval(function() ...
JavaScript是一种基于原型的动态类型语言,它允许函数成为一等公民,也就是说,函数可以作为变量赋值、作为参数传递、作为返回值等。 一、函数的特性 1. 高阶函数:JavaScript支持高阶函数,即函数可以接受其他函数...
了解和掌握在JavaScript对象中如何正确使用setTimeout和setInterval是非常重要的,特别是在涉及到this指向问题时,我们需要明白JavaScript函数作用域与执行上下文的机制,利用函数的特性,如闭包或bind方法来解决...