在 Javascript 中使用 setTimeout 从数组调用函数
2013-10-06
810
我创建了两个函数名 call 和 call2,并将这两个函数放在数组 x 中。在另一个名为 timer 的函数中,我尝试每 2 秒调用一次此函数。但它给出错误 应为分配或函数调用,而不是显示和表达式 。
而且,我不希望在创建数组时运行这些函数。 这是我的代码 http://jsbin.com/IMiVadE/2/
function call(name)
{
console.log("Hello " + name);
}
function call2()
{
console.log("Hello world");
}
var x = [call("Nakib"), call2()];
var i = 0;
function timer(x, i)
{
x[i];
i++;
if(i<x.length)
window.setTimeout(timer(x, i), 2000);
}
timer(x, i);
3个回答
您的代码中存在一些错误:
- call2() 调用该函数。正确:call2 是对该函数的引用。
- x[i] 访问值(函数引用)。您需要 x[i]() 来执行该函数。
以下是您的代码的运行情况: http://jsbin.com/IMiVadE/6/edit
sayHello(name) 是一个函数,它生成输出特定“Hello ...”文本的新函数。
function sayHello(name)
{
return function () {
console.log("Hello " + name);
}
}
function timer(x, i)
{
x[i]();
if (i < x.length - 1) {
setTimeout(function () {
timer(x, i + 1);
}, 2000);
}
}
var x = [sayHello("Nakib"), sayHello("world")];
setTimeout(function () {
timer(x, 0);
}, 2000);
Sanjo
2013-10-06
setTimeout
需要一个没有参数的函数。因此,您可以将对
timer
的递归调用包装在匿名函数中以解决此问题:
window.setTimeout(function(){timer(x, i)}, 2000);
此外,您的计时器函数中的第一行仅由
x[i];
组成,这是无用的,尽管它可能不是导致问题的原因。
GolezTrol
2013-10-06
setTimeout
函数以函数为参数,您在传递
timer
函数之前执行该函数,并且由于
timer
不返回任何内容,因此将
undefined
传递给超时;
window.setTimeout(timer(x, i), 2000); // is the same as...
window.setTimeout(undefined, 2000);
应该是;
window.setTimeout(function() { timer(x, i) }, 2000); // or...
window.setTimeout(timer.bind(this, x, i), 2000);
我不确定这是否是故意的,但您对数组执行了同样的事情;
var x = [call("Nakib"), call2()];
这将执行函数,并且它们的结果将存储在数组中。这是您想要的吗?
Jivings
2013-10-06