4

我想将一个对象数组传递给 Javascript 中的 setTimer 函数。

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

这段代码出错了。

**注意:**对不起!我的问题中的一些更正: setInterval() 函数中是否可能。

4

3 回答 3

17

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

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

为什么有效:

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

这种语言特性称为闭包

如果您将字符串作为这些函数的第一个参数传递,则代码将使用对 eval函数的调用在内部执行,这样做被认为是一种好的做法

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

于 2009-08-14T05:08:41.007 回答
2

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

如果您需要在设置 timeout 时将参数绑定到函数调用,那么简单的函数附件将不起作用:

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 秒后输出“immediate A”、“immediate B”和“immediate 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”没有让你到达那里,它可以进一步扩展以接受上下文参数。

于 2010-04-10T18:16:49.647 回答
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);

编辑:我的函数(或者我在备份中找到的至少 1 次迭代)

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

或给定:

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);
于 2009-08-14T05:13:12.870 回答