`
anson_xu
  • 浏览: 514690 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

settimeout、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){
       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>

 

 

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

  1. function f(){   
  2.     var a = [];   
  3.     var i;   
  4.     for(i=0;i<3;i++){   
  5.         a[i] = function(){   
  6.             alert(i);   
  7.             return i;   
  8.         }   
  9.     }   
  10.     return a;   
  11. }   
  12.   
  13. var a= f();   
  14. a[0]();//3   
  15. a[1]();//3   
  16. a[2]();//3  
  17. //我们新建了三个闭包,都指向了变量i。闭包并没有记住变量i的值,它仅是变量i的引用。在循环结束后,i的值是3,所以结果都是3
  18. a[0]是个函数引用,所以后面要加()来执行。
  19. 也可以写成:
  20. a[i] = (function(x){    
  21.             alert(x);   
  22.             return x;   
  23.         })(这里传参数 i 给x)      
  24. 这样最后的a[0]就不用()了,因为a[i]付的值是return i;

 

  1. function f() {   
  2.   var a = [];   
  3.   var i;   
  4.   for(i = 0; i < 3; i++) {   
  5.     a[i] = (function(x){   
  6.       return function(){   
  7.         alert(x);   
  8.         return x;   
  9.       }   
  10.     })(i);   
  11.   }   
  12.   return a;   
  13. }   
  14.   
  15. var a = f();   
  16. a[0]();//0   
  17. a[1]();//1   
  18. a[2]();//2  
  19. //我们又用了一个闭包,把变量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]不是函数

分享到:
评论

相关推荐

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

    在 JavaScript 中,setTimeout 和 setInterval 函数都是用于在指定的时间点执行某个函数的,但是它们的传参方式和调用方式却有所不同。 setTimeout 函数 setTimeout 函数用于在指定的时间点执行某个函数,语法格式...

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

    闭包传递参数** 有时我们需要在延迟执行的函数中使用在外部作用域定义的变量。由于JavaScript的词法作用域特性,外部函数的变量在内部函数中依然可访问。因此,我们可以通过创建闭包来传递参数。例如: ```...

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

    这意味着,如果你试图通过 `setTimeout` 传递参数给函数,则函数内部将无法获取这些参数。 示例代码如下: ```javascript function show(str) { alert("mysite: " + str); } setTimeout(show, 100, ...

    setInterval使用 每隔一定时间执行操作

    此外,`setInterval` 也常与函数闭包一起使用,以便在重复执行的函数中保留状态。例如,我们可以用它来实现计数器: ```javascript var count = 0; setInterval(function() { console.log('Count:', count++); }, ...

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

    然而,当需要在setTimeout或setInterval中调用函数并传递参数时,问题就会出现。直接在字符串形式的方法中传递参数是不行的,因为Timer线程无法访问非全局变量。例如: ```javascript function delayRun(param) { ...

    理解javascript定时器中的setTimeout与setInterval

    在标准浏览器和IE10及以上版本,`setTimeout`可以接受额外参数,直接传递给延迟执行的函数。 另一方面,`setInterval`用于周期性地调用函数,直到被`clearInterval`取消。其语法结构相似: ```javascript var ...

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

    在这个解决方案中,我们为每个迭代创建了一个自执行的匿名函数,将当前的`i`值作为参数传递给它。这个匿名函数内部创建了一个新的作用域,其中的`e`是`i`的一个副本。因此,当`setTimeout`的回调函数执行时,它引用...

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

    这样,当`setTimeout(f, mDelay)`执行时,`f`会携带正确的参数执行`fRef`。 ### 解决方法二:函数字符串化 另一种方法是直接将带参数的函数表示为一个字符串,然后在`setTimeout()`内部解析这个字符串。这种方法的...

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

    setInterval函数用于循环执行代码。它的基本语法是: ``` var intervalId = window.setInterval(func, delay); ``` 这里,func是要循环执行的函数或代码,delay是延迟时间,以毫秒为单位。函数执行的间隔就是这个...

    js闭包理解之倒计时

    1. **定时器(setTimeout或setInterval)**:倒计时的核心是定时器,JavaScript提供了`setTimeout`和`setInterval`这两个函数来周期性地执行某段代码。`setTimeout`用于一次性的延迟执行,而`setInterval`则会每隔...

    闭包javascript.pdf

    4. **异步编程**:在处理如`setTimeout`、`setInterval`和Ajax回调等异步操作时,闭包提供了强大的支持,允许我们在回调函数中访问外部作用域的变量。 ### 总结 闭包是JavaScript中一个核心且复杂的概念,掌握它...

    20200103-王正正-js的执行顺序和闭包的探究.docx

    宏任务包括整体脚本、setTimeout、setInterval等,它们在一个事件循环周期内按顺序执行。微任务则包括Promise、process.nextTick等,它们在当前宏任务执行完毕后,但在下一个宏任务开始前执行。 例如,以下代码展示...

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

    在JavaScript中,`setTimeout`和`setInterval`是两个至关重要的方法,它们允许开发者在特定的时间...同时,尽可能使用函数对象而非字符串,利用闭包传递参数,并注意异步执行的特性,以优化代码的执行效率和可靠性。

    谈谈JavaScript中的函数与闭包

    3. 回调函数:异步操作如定时器(setTimeout或setInterval)常常使用闭包来保持对外部变量的访问。 4. 事件处理:当为DOM元素添加事件监听器时,可以使用闭包来保持对事件处理函数外部状态的访问。 总结: ...

    从setTimeout看js函数执行过程

    例如,通过立即执行的函数表达式(IIFE)创建一个新的作用域,我们可以将`i`作为参数传递,从而避免了变量提升(hoisting)导致的问题。 ```javascript for (var i = 0; i ; i++) { (function(i) { setTimeout...

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

    这里,我们通过立即执行函数表达式(IIFE)创建了一个闭包,传入`i`作为参数`x`。每个IIFE都有自己的作用域,因此`x`的值在每个函数中都是独立的,`setTimeout`中函数执行时会输出正确的`x`值。 除了使用IIFE创建...

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

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

    javascript经典特效---函数计算.rar

    10. **定时器与延时函数**:`setTimeout`和`setInterval`是实现延迟执行或周期性执行函数的常用工具,它们可以创建出各种动态效果。 在提供的"函数计算.htm"文件中,可能详细讲解了如何使用JavaScript函数来实现...

    JQuery中SetTimeOut传参问题探讨

    标题中提到的“JQuery中SetTimeOut传参问题探讨”说明我们要探讨的是在使用JavaScript的JQuery库进行编程时,如何在使用`setTimeout`或`setInterval`函数时传递参数的问题。`setTimeout`和`setInterval`是JavaScript...

Global site tag (gtag.js) - Google Analytics