当前位置:编程学习 > JS >>

JS中setInterval、setTimeout不能传递带参数的函数的解决办法

分享JS中setInterval、setTimeout不能传递带参数的函数的解决办法

在JS中无论是setTimeout还是setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要带参数,这就需要想方法解决。

一、采用字符串形式:——(缺陷)参数不能被周期性改变

setInterval("foo(id)",1000);

二、匿名函数包装

window.setInterval(function()

    {

foo (id);

    }, 1000);

   这样就可以周期性执行foo(id)这个函数,而且把变量id传递进去;

三、定义返回无参函数的函数

function foo(id)

{

   alert(id);

}

function _foo(id)

{

return function()

{

foo(id);

}

}

window.setInterval(_foo(id),1000);

这里定义了一个函数_foo,用于接收一个参数,并返回一个不带参数的函数,在这个函数内部使用了外部函数的参数,从而对其调用,不需要使用参数。在 window. setInterval函数中,使用_foo(id)来返回一个不带参数的函数句柄,从而实现了参数传递的功能。

四、修改setInterval

function foo(id)

{

alert(id);

}

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

以上的所有方法也适合setTimeout。

使window.setTimeout/window.setInterval执行带参数的函数的方式(以setTimeout为例):
1.使用字符串形式.
如:window.setTimeout("alert('ok')",1000);
      或
    var msg = "ok";
    window.setTimeout("alertMsg(msg)", 1000);
    function alertMsg(pmsg) {
        alert(pmsg);
    }
2.借助嵌套匿名函数.
如:window.setTimeout(helpFn("ok"), 1000);
    function helpFn(pmsg) { return function() { alert(pmsg); } }
3.修改原 window.setTimeout
如:
//*=============================================================
//*   功能: 修改 window.setTimeout,使之可以传递参数和对象参数   www.zzzyk.com
//*   方法: setTimeout(回调函数,时间,参数1,,参数n)  参数可为对象:如数组等
//*=============================================================
    window.setTimeout = function(callback, timeout, param) {
        var args = Array.prototype.slice.call(arguments, 2);
        setTimeout(function() { callback.apply(null, args); }, timeout)
    }
    window.setTimeout(alertMsg, 1000, "ok");
    function alertMsg(pmsg) {alert(pmsg);

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,