zoukankan      html  css  js  c++  java
  • 关于setTimeout和setInterval的函数参数问题

    今天在写验证码倒计时小demo时,用了如下代码:

    window.setTimeout(count(num),1000);
    
    

    这样直接使用将使count函数立即执行,并将返回值传递给setTimeout函数作为参数,其结果并不是真正需要的,所以会出现问题。

    方法一

    使用字符串形式可以达到想要的结果:

    window.setTimeout("count(num)",1000);
    

    这是我以前常用的方法。

    但这种写法是将函数包在引号里,有点像字符串,不够直观

    而且有些场合必须使用函数名,于是上网查阅了以下方法:

    方法二

    //倒计时函数  
    function count(_num){  
           ...  
    }  
    //创建一个函数,用于返回一个无参数函数  
    function _count(_num){  
           return function(){  
                 count(_num);  
           }
    }  
    //这里30是实参
    window.setTimeout(_count(30),1000);  
    

    这里定义了一个函数_count,用于接收一个参数,并返回一个不带参数的函数,在这个函数内部使用了外部函数的参数,从而对其调用,不需要使用参数。

    在 window.setTimeout函数中,使用_count(30)来返回一个不带参数的函数,此时不需要用引号也实现了参数传递的功能。

    其实还可以直接写成:

    window.setTimeout(function(){count(30);},1000);
    

    另外也有人通过修改setTimeout、setInterval来实现。即:

    方法三

    //功能函数
    function count(_num){
           ...
    }//*=============================================================
    //*   功能: 修改 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(count,1000,30);
    

    此方法实际将原函数的参数数组改造了一下,看懂还是比较容易,先摘抄过来以备不时之用。

  • 相关阅读:
    【iOS系列】-UITableView的使用
    c语言学习-指针探究
    sublime text 3 乱码
    连接sql2008时报错
    android各种菜单使用介绍
    Android使用开源框架加载图片
    Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用
    Android开发pool解析xml
    github的提交源码到服务器
    Android多线程更新UI的方式
  • 原文地址:https://www.cnblogs.com/macq/p/6490363.html
Copyright © 2011-2022 走看看