我想在Javascript中将对象数组传递给setTimer函数。
setTimer("foo(object_array)",1000);
我在这段代码上收到错误。
**注意:**抱歉!我的问题中有一些更正:是否可以在setInterval()函数中使用。
答案 0 :(得分:17)
在setTimeout或setInterval函数的第一个参数上使用匿名函数而不是字符串:
// 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);