如何将Array对象传递给setInterval函数

时间:2009-08-14 05:06:46

标签: javascript settimeout setinterval

我想在Javascript中将对象数组传递给setTimer函数。

setTimer("foo(object_array)",1000);

我在这段代码上收到错误。

**注意:**抱歉!我的问题中有一些更正:是否可以在setInterval()函数中使用。

3 个答案:

答案 0 :(得分:17)

setTimeoutsetInterval函数的第一个参数上使用匿名函数而不是字符串:

// assuming that object_array is available on this scope
setInterval(function () { foo(object_array); }, 1000);

为什么会这样:

定义内部函数时,它可以引用其中存在的变量 外部封闭功能,即使它们的父功能已经终止。

此语言功能称为closures

如果您传递一个字符串作为这些函数的第一个参数,那么代码将在内部使用eval函数调用执行,并且这样做被视为{ {3}}

Eval提供对JavaScript编译器的直接访问,并使用调用者的权限执行它传递的代码,也使用eval 重复/广泛(即你的setInterval函数是一个很好的例子)将导致表现问题。

答案 1 :(得分:2)

我将在这里扩展Luke的答案,因为它解决了CMS的问题(以及对此类问题的大多数答案)没有解决的问题。

如果您需要在设置超时时将参数绑定到函数调用,则简单的功能封装将无效:

echo = function (txt) { console.log(txt); };

val = "immediate A";
echo(val);

val = "delayed";
window.setTimeout(function () { echo(val); }, 1000);

val = "immediate B";
echo(val);

假设您正在使用Firebug的控制台,以上将在1秒后输出“立即A”,“立即B”然后“立即B”。要在setTimeout调用时绑定值,请使用Luke的陷阱方法。以下修改它以接受任意函数和参数长度:

echo = function (txt) { console.log(txt); };

trap = function (fn, args) {
    return function() {
        return fn.apply(this, args);
    };
};

val = "immediate A";
echo(val);

val = "delayed";
window.setTimeout( trap(echo, [val]), 1000);

val = "immediate B";
echo(val);

不确定是否有办法隐式传递调用者的上下文,但是如果“this”没有让你在那里,它可以进一步扩展为接受上下文参数。

答案 2 :(得分:1)

首先,它是'setTimeout'

第二,不要传递字符串。真正的解决方案取决于代码的其余部分。最强大的方法是捕获范围:

var obj_array = something;
function trap(obj)
{
    function exec() { foo(obj); }
    return exec;
}
setTimeout(trap(obj_array), 1000);

trap返回一个函数,该函数将您的数组捕获在其作用域中。这是一个通用功能,但为了使其特定于您的问题,可以简化:

var obj_array = something;
function trap()
{
    function exec() { foo(obj_array); }
    return exec;
}
setTimeout(trap(), 1000);

甚至:

var obj_array = something;
function trap()
{
    foo(obj_array);
}
setTimeout(trap, 1000);

最后浓缩为:

var obj_array = something;
setTimeout(function() { foo(object_array); }, 1000);

编辑: 我的功能(或者我在备份中找到的至少一次迭代)

Function.prototype.createDelegate = function(inst, args) { 
    var me = this;
    var delegate = function() { me.apply(inst, arguments); }
    return args ? delegate.createAutoDelegate.apply(delegate,args) : delegate;
};
Function.prototype.createAutoDelegate = function() {
    var args = arguments;
var me = this;
return function() { me.apply({}, args); }
};

下式给出:

function test(a, b) { alert(a + b); }

用法:

setTimeout(test.createAutoDelegate(1, 2), 1000);

或GIVEN:

var o = { a:1, go : function(b) { alert(b + this.a); }}

用法:

setTimeout(o.go.createDelegate(o,[5]), 1000);
//or
setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);