关于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);

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go 语言范围(Range)

Go 语言中 range 关键字用于for循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元...

3235
来自专栏菜鸟前端工程师

JavaScript学习笔记003-函数0属性0模板字符串

992
来自专栏柠檬先生

jquery 筛选元素 (2)

.add()   创建一个新的对象,元素添加到匹配的元素集合中。   .add(selector)     selector 一个字符串表示的选择器...

2058
来自专栏Pythonista

Go 语言常量

在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。

721
来自专栏python百例

06-字符串使用基础

1122
来自专栏菜鸟前端工程师

JavaScript学习笔记010-DOM节点的运用

893
来自专栏代码世界

Python基础数据类型之列表和元组

一、列表   list   列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,...

29312
来自专栏老司机的技术博客

人人都能学会的python编程教程7:元祖(tuple)

为什么报错呢?因为元祖的一大特点就是不可更改,字符串和数字也是一样。虽然可以通过变量让它指向不同的字符串、数值或元祖内,但是不能改变数字本身。

4648
来自专栏deepcc

javaScript创建无边框iframe兼容ie

3515
来自专栏积累沉淀

Linux shell ${}简单用法

Linux shell ${}简单用法 [转]http://linux.chinaunix.net/techdoc/develop/2007/05/05/9...

1996

扫码关注云+社区

领取腾讯云代金券