`
zha_zi
  • 浏览: 594052 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

setinterval 使用闭包解决参数不能传递的问题

 
阅读更多

settimeout、setinterval执行能传递参数的函数(闭包)

无论是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>

 

 

 

//----------------------------实例三---------------------------

  1. 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  
     
  2. //我们新建了三个闭包,都指向了变量i。闭包并没有记住变量i的值,它仅是变量i的引用。在循环结束后,i的值是3,所以结果都是3
  3. a[0]是个函数引用,所以后面要加()来执行。
  4. 也可以写成:
  5. a[i] = (function(x){    
  6.             alert(x);   
  7.             return x;   
  8.         })(这里传参数 i 给x)      
  9. 这样最后的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  

 

  1. //我们又用了一个闭包,把变量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]不是函数

分享到:
评论

相关推荐

    精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!

    在JavaScript编程中,window对象下的setTimeout和setInterval是两个非常重要的...总之,理解并正确使用setTimeout和setInterval,尤其是掌握它们在参数传递方面的问题和解决方法,是前端开发人员必须具备的技能之一。

    JavaScript中setTimeout和setInterval函数的传参及调用_.docx

    JavaScript 中 setTimeout 和 ...使用闭包可以正确地传递参数,避免出现意外的结果。同时,需要注意函数的调用方式,例如 `setTimeout(auto, 4000)` 和 `setInterval(auto, 4000)`,这两种方式都是正确的调用方式。

    采用自执行的匿名函数解决for循环使用闭包的问题

    首先,让我们看一个简单的例子,这个例子展示了在不使用自执行匿名函数时遇到的问题: ```javascript function f1() { for (var i = 0; i ; i++) { setTimeout(function() { alert(i); }, 1000); } } f1(); ``...

    闭包javascript.pdf

    这是JavaScript中非常强大且灵活的一个特性,因为它允许函数“携带”数据,而无需将数据作为参数传递。 ### 闭包的实现与理解 闭包的概念可能对初学者来说有些难以理解,因为它涉及到作用域、内存管理以及函数执行...

    JavaScript中setTimeout和setInterval函数的传参及调用

    在使用setTimeout和setInterval时,我们常常需要传递参数给将要执行的函数。但在JavaScript中,如何向setTimeout和setInterval传递参数呢?我们首先要了解,这两个函数是把要执行的代码插入到JavaScript引擎维护的一...

    js代码-setInterval() 参数问题

    通过查看和分析`main.js`的代码,我们可以更具体地解决其中的问题,或者学习如何正确使用`setInterval()`。`README.txt`文件可能提供了关于`main.js`的说明或者使用指导。 总的来说,理解和掌握`setInterval()`的...

    JavaScript setTimeout使用闭包功能实现定时打印数值

    在JavaScript编程中,`setTimeout`函数是实现定时任务的一种常用方法。而闭包(Closure)是JavaScript的一个重要概念...通过这些知识点,我们可以在不使用`setInterval`的情况下,依次定时执行函数,并输出预期的结果。

    setTimeout和setInterval的浏览器兼容性分析

    在IE浏览器中,`setInterval` 同样存在不支持函数参数传递的问题。这意味着,如果尝试通过 `setInterval` 传递参数给函数,则函数内部同样无法获取这些参数。 ##### 解决方案 解决 `setInterval` 的兼容性问题的...

    js代码-定时器闭包传参

    在JavaScript编程中,"js代码-定时器闭包传参"这一主题涉及到两个核心概念:定时器(Timer)和闭包(Closure),以及如何通过它们传递参数。在JavaScript中,定时器是通过`setTimeout`或`setInterval`函数实现的,...

    关于JS中setTimeout()无法调用带参函数问题的解决方法.docx

    然而,一个常见的问题是在尝试使用`setTimeout()`调用带参数的函数时,参数往往无法正确传递。这是因为`setTimeout()`默认只接受一个函数引用和一个延迟时间作为参数,而不直接支持传递额外的参数。这个问题可以通过...

    轻松学习Javascript闭包

    如果将一个对象作为参数传递给闭包,那么闭包所引用的对象将是原始对象的引用,而非对象的副本。这意味着,如果闭包内部函数修改了对象的属性,那么这个对象的所有引用都将反映这一改变。 闭包的用途十分广泛,包括...

    setTimeout与setInterval在不同浏览器下的差异

    IE的实现允许传递三个参数,其中第三个参数用于指定脚本语言类型,而其他浏览器可能将所有额外的参数都作为函数调用的参数传递。 在实践中,推荐使用函数对象而不是字符串形式来调用`setTimeout`,因为这样可以避免...

    理解javascript定时器中的setTimeout与setInterval

    为了解决这个问题,可以使用闭包保存对当前`this`的引用,如下所示: ```javascript function shape(name) { this.name = name; this.timer = function(){alert('my shape is '+this.name)}; var _this = this; ...

    详解JS中定时器setInterval和setTImeout的this指向问题

    总结一下,`setInterval`和`setTimeout`中的`this`问题可以通过保存`this`的引用或者使用`bind`方法来解决。理解这一点对于编写复杂的JavaScript代码至关重要,特别是在涉及对象方法和异步操作时。

    深入理解JavaScript 闭包究竟是什么

    为了解决这个问题,可以使用闭包来创建一个新的作用域,确保每个函数都有自己的`i`副本。这可以通过立即执行函数表达式(IIFE)实现,如第二个例子所示: ```javascript (function(num) { spans2[i].onclick = ...

    Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)

    下面是一个具体的例子,演示了如何使用setInterval和setTimeout,以及如何传递参数: ``` // 循环执行,每隔3秒钟执行一次showalert(),showalert()函数接收一个参数 var timeId = window.setInterval(function() ...

    谈谈JavaScript中的函数与闭包

    JavaScript是一种基于原型的动态类型语言,它允许函数成为一等公民,也就是说,函数可以作为变量赋值、作为参数传递、作为返回值等。 一、函数的特性 1. 高阶函数:JavaScript支持高阶函数,即函数可以接受其他函数...

    Javascript对象中关于setTimeout和setInterval的this介绍

    了解和掌握在JavaScript对象中如何正确使用setTimeout和setInterval是非常重要的,特别是在涉及到this指向问题时,我们需要明白JavaScript函数作用域与执行上下文的机制,利用函数的特性,如闭包或bind方法来解决...

Global site tag (gtag.js) - Google Analytics