我想通过一个目列的setTimer功能在Javascript。

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

我越来越错误,这个代码。

**注:**对不起!一些正在我的问题:是否有可能在若第()function.

有帮助吗?

解决方案

使用匿名的功能,而不是一串的第一个参数 若第一个 职能:

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

为什么它的工作:

在定义内的功能,可以参考的变量存在于他们的 外围的功能后,即使其父母职能已经终止。

这种语言的特征是所谓 关闭.

如果你通过一个字符串的第一个参数的这些职能,代码将执行内部使用一个电话的 eval 功能,这样做是 认为作为 良好的实践.

Eval提供直接访问JavaScript编译器执行码是通过与特权的呼叫者,也使用eval 反复地/广泛地 (即你若第一个函数是一个很好的例子)将导致性能的问题。

其他提示

我要对卢克的答案在这里展开,因为它解决了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);

假设你在后面使用萤火虫的控制台,上述将输出“即时A”,“立即B”,然后“立即B” 1秒。该值在setTimeout调用使用卢克的陷阱方法的时间约束。以下修改它有点接受任意的功能和参数长度:

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”没有得到你。

第一,它的 '的setTimeout'

第二,不传递的字符串。真正的解决方案取决于代码的其余部分。最可靠的方法将是陷阱范围:

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

陷阱返回具有您的阵列被困在其范围的函数。这是一个通用的功能,但使它具体到你的问题,它可以简化为:

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top