关于定时器调用有参函数的问题

对于一个已经定义好的函数,如:

function sayhello(myname){
     alert("hello"+myname);
}
setInterval(sayhello,300);

此时由于无法传递参数而只能输出hello

而对于另一种写法:

function sayhello(myname){
     alert("hello"+myname);
}
setInterval(sayhello(Name),300);

此时会发生一种现象就是,window直接调用sayhello函数,并且传入参数;

显然这种方法不靠谱,因此对于这个问题其中一个比较常用的解决方法就是:

function timer(myname){
    function sayhello(myname){
     alert("hello"+myname);
}
   return sayhello;
}
setInterval(sayhello(Name),300);

也就是说,我们可以把需要调用的函数嵌入到另一个函数中,然后把函数自身作为返回值(注意返回值不加括号)返回到新的函数中,

在通过定时器传参给新函数,再通过新函数传参给需要点用的函数。

其实主要原因还是在上一篇的随笔中提到的的一个函数加不加括号的问题,加了括号返回的就是整个函数体,所以会立即执行该函数,

不加括号就是调用函数名,函数名就相当于一个指向函数的指针,而不是函数本身。

时间: 2024-10-12 20:09:45

关于定时器调用有参函数的问题的相关文章

Oracle定时器调用存储过程

1. 创建表 create table job_table(run_time date); 2. 创建存储过程 create or replace procedure job_proc is begin insert into job_table (run_time) values (sysdate); end; 3. 创建定时器job,并且指定为一分钟执行一次 declare job number; begin dbms_job.submit(job, 'job_proc;', sysdate

js给定时器调用传递参数

给定时器调用传递参数 无论是window.setTimeout 还是window.setInterval,在使用函数名作为调用句柄时都不 能带参数,而在许多场合必需要带参数,这就需要想方法解决.例如对于函数hello(_name), 它用于针对用户名显示欢迎信息: var userName="jack"; //根据用户名显示欢迎信息 function hello(_name){ alert("hello,"+_name); } 这时,如果企图使用以下语句来使hell

使用定时器调用mysql的存储过程 -- navicat客户端

1.使用游标创建存储过程 SQL创建: create PROCEDURE daily_max_avg_online() BEGIN declare max_online int; declare avg_online int; declare time TIMESTAMP; declare cur cursor for select MAX(online_num),round(avg(online_num)), DATE_FORMAT(statistical_time ,'%y-%m-%d')

js定时器调用参数的方法

var userName="Tony"; //根据用户名显示欢迎信息 function ss(_name){ alert("ss,"+_name); } 使用字符串形式可以达到想要的结果: window.setTimeout("ss(userName)",3000); 这里的字符串是一段JavaScript 代码,其中的userName 表示的是变量.但这种写法不够直观,而且有些场合必须使用函数名 <script language=&quo

Spring定时器调用Hibernate方法无法获得SessionFactory的解决办法

由于在Spring定时器中无法通过注解的方式获取bean,因此需要通过原生的方式获取.获取session的方式如下: WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); SessionFactory factory=wac.getBean(SessionFactory.class); Session session=factory.openSession();

cocos2dx 3.x(定时器或延时动作自动调用button的点击响应事件)实现自动内测

1 // 2 // ATTGamePoker.hpp 3 // MalaGame 4 // 5 // Created by work on 2016/11/09. 6 // 7 // 8 9 #ifndef ATTGamePoker_hpp 10 #define ATTGamePoker_hpp 11 12 #include <stdio.h> 13 #include <cocos2d.h> 14 15 16 class ATTGamePoker : public cocos2d:

你不知道的JavaScript--Item23 定时器的合理使用

1.定时器概述 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可以使一段代码每过指定时间就运行一次.它们的原型如下: window.setTimeout(expression,milliseconds); window.setInterval(expression,milliseconds); 其中,expression可以是用引号括起来的一段代码,也可以是一个

【转】IOS NSTimer 定时器用法总结

原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; -

tableViewcell上放定时器

tableviewcell上的定时器: 1.创建一个管理定时器的TimerManger类, TimerManger.h #import <Foundation/Foundation.h> @interface TimerManger : NSObject /** 结束定时器 */ - (void)stopTimer; /** 开始定时器 */ - (void)startTimerWithTimeInterVal:(NSTimeInterval)timeInterVal; /** 单利 */ +