使用匿名函数给setInterval()传递参数

在使用JScript的时候,我们有时需要间隔的执行一个方法,比如用来产生网页UI动画特效啥的。这是我们常常会使用方法setInterval或setTimeout,但是由于这两个方法是由脚本宿主模拟出来的Timer线程,在通过其调用我们的方法是不能为其传递参数。

我们常用的使用场景是:

window.setTimeout(“delayRun()”, n);
window.setInterval(“intervalRun()”, n);

window.setTimeout(delayRun, n);
window.setInterval(intervalRun, n);

显然强行代参数的调用:

window.setTimeout(“delayRun(param)”, n);
window.setInterval(“intervalRun(param)”, n);

window.setTimeout(delayRun(param), n);
window.setInterval(intervalRun(param), n);

都是错误的,因为string literals形式的方法调用,param必须是全局变量(即window对象上的变量)才行;而function pointer形式的调用,完全错误了,这是把函数的返回值当成了setTimeout/setInterval函数的参数了,完全不是我们所望的事情

解决这个问题的办法可以使用匿名函数包装的方式,在以下scenario中我们这么做:

function foo()
{
    var param = 100;
    window.setInterval(function()
    {
        intervalRun(param);
    }, 888);
}

function interalRun(times)
{
    // todo: depend on times parameter
}

这样一来,就可以不再依赖于全局变量向delayRun/intervalRun函数中传递参数,毕竟当页面中的全局变量多了以后,会给脚本的开发、调试和管理等带来极大的puzzle。

时间: 2024-08-11 01:17:36

使用匿名函数给setInterval()传递参数的相关文章

对匿名函数的深入理解(彻底版)

从简单的字面理解就是一个没有名字的函数,但是如果说它只是这样简单,那我也就没有必要来说这些. 对匿名函数的理解1: function(){ console.log(1); } // 报错 不能直接使用. 对匿名函数的理解2: var a = function(){ console.log(1); } a(); //1 匿名函数可以依附于一个变量,并且这个变量名就是这个匿名函数的名字. var a = function(){ console.log(1); } console.log(typeof

setInterval(code, time)中code传递参数办法

1.使用setInterval的场景 有时我们需要隔一定的时间执行一个方法,这时就会用到setInterval,但是由于这个方法是浏览器模拟出的Timer线程,在调用我们方法时不能为其传递参数. 2.setInterval传递参数办法 (1)采用string literals形式 setInterval("interval(param)",1000); 缺点:param必须是全局变量(即window对象上的变量),参数不能被周期性改变 (2)匿名函数包装 window.setInter

python内置函数及匿名函数

locals  本地作用域/局部作用域 会随着位置的改变而改变globals 全局作用域           永远不变 永远是全局 a = 1 b = 2 print(locals()) print(globals()) def func(): c = 3 d = 4 print(locals()) def func2(): l1 = [] d1 = {} print(locals()) #无论在哪里打印 得到的都是全局作用域中的名字 func() func2() # 结果 # {'__name

Qt5教程 (5) Lambda匿名函数的使用

Lambda是C++11的新特性, 首先看看你的.pro项目文件里有没有CONFIG += c++11这句话, 没有就加上. 下面新建一个工程, 具体步骤就不多说了 然后给主窗口添加一个按钮b, 并且包含头文件, 下面要用. 我们先来看一下匿名函数最简单的使用 connect(&b, &QPushButton::clicked, [] () { qDebug() << "1111"; } ); 之后保存运行, 点击按键会发现, 1111被打印出来了. 这个匿

python之匿名函数lambda

# lambda:匿名函数 # 语法:lambda 参数: 表达式 answer = lambda x: x * 5 print("answer(5): ", answer(5)) # lambda做为参数 def test_fun(x=lambda x: x * 5): return x(5) n = test_fun(lambda x: x * 5) print("x(5): ", n) 运行结果: answer(5): 25 x(5): 25

Javascript的匿名函数与自执行

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 1 2 3 function double(x){        return 2 * x;       } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. 1 var double = new Function('x', 'return 2 * x;'); 第三种: 1

回调、匿名函数和闭包

(1) is_callable用来检测传进来的值能被call_user_func或者array_walk等函数使用,它非常智能,能够测试数组,数组形式的有效回调应该是以对象作为第一个元素,以方法名作为第二个元素,类似 array('new SomeClass()', 'someFunc'). 下面用例子来说明: 1 function a(){ 2 3 } 4 5 $a = 'a'; 6 7 if(is_callable($a)){ 8 9 echo 'a is callable <br>';

python函数 位置参数,关键字参数,可变参数优先级

def fun(arg,args=1,*arg,**keywords): python 一共有这四类参数,第一类最常见,不用多说,第二类,关键字参数,python能通过关键字找到参数,python函数的这种特性使得函数参数更加灵活,不一定要按顺序来传,第三类:一个星号是将非关键字参数收集起来,以tuple的形式保存,第四类则必须要提供”传递参数名=传递参数值”形式传递参数. 至于怎么传,相信大家都知道,这里不多说. 要说明的是在python2中这四类参数传递时是有优先顺序的,不管是定义函数,还是

王爽-汇编语言-综合研究五-函数接收不定量参数

(一) 研究目的 我们知道,在C语言中,函数是可以传递参数的.有些函数在声明是就定义了要传的参数的个数,比如我们定义void a(int i);这说明函数a只接受一个int型参数.而有些函数,比如print函数,是可以接收不定个数的参数的.那函数是怎样接收不定量参数的呢? (二) 研究过程 1) 有限个数的参数 首先我们来看程序是如何传参数的.我们编写一个程序,让他传递有限个参数: 我们编译链接,然后反汇编查看其代码: 我们看其代码,首先,在main函数中,分别将‘a’与2对应的ASCLL码放到