Javascript 为什么应该由setTimeout安排的函数调用会立即执行?

Javascript 为什么应该由setTimeout安排的函数调用会立即执行?,javascript,loops,for-loop,settimeout,Javascript,Loops,For Loop,Settimeout,这是我的问题。我有这个功能来测试代理服务器 function crawl() { var oldstatus = document.getElementById('status').innerHTML; document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />"; var url = document.getElementById('url').val

这是我的问题。我有这个功能来测试代理服务器

function crawl() {
    var oldstatus = document.getElementById('status').innerHTML;
    document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />";
    var url = document.getElementById('url').value;
    var proxys = document.getElementById('proxys').value.replace(/\n/g,',');

    var proxys = proxys.split(",");

    for (proxy in proxys) {
        var proxytimeout = proxy*10000;
        setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
    }
}
我希望在大约10秒的时间间隔内调用'doRequest'函数,但即使使用setTimeout,也会立即调用这些函数

欢迎提出任何意见,谢谢


PS:即使我为“proxytimout”输入了任意值,它也没有效果。

这一行就是问题所在:

setTimeout(doRequest(url,proxys[proxy]), proxytimeout);
编写doRequest实际上是调用函数。您需要传递函数本身:

setTimeout(doRequest, proxytime, url, proxys[proxy]);

当您以这种形式将函数赋予setTimeout时,函数将被执行,而不是传递给setTimeout。您有三种选择可以让它工作:

首先给出函数,然后给出超时和参数作为最后一个参数:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
或者只写一个将被计算的字符串:

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);
第三种方式是传递一个调用该函数的匿名函数。请注意,在这种情况下,您必须在闭包中执行此操作,以防止值在循环中更改,因此这有点棘手:

(function(u, p, t) {
    setTimeout(function() { doRequest(u, p); }, t);
})(url, proxys[proxy], proxytimeout);

第二种格式有点老套,但如果参数是标量值字符串、整数等,则可以使用。第三种格式有点不清楚,因此在这种情况下,第一种格式显然最适合您。

您误解了setTimeout函数

setTimeout函数接受一个函数并在以后执行。 通过写入setTimeoutdoRequesturl、proxys[proxy]、proxytimeout,可以立即调用doRequest函数,并传递结果,假设它将另一个函数返回到setTimeout

您需要将doRequest的参数传递给setTimeout,如下所示:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

这将在不首先调用doRequest函数的情况下传递setTimeout函数本身,并在doRequest最终调用它时传递给它的参数。

如果我错了,请纠正我的错误,但由于这是在循环中发生的,所以您给出的第二个方法将不起作用。代理的值将更改,因为没有创建闭包。@nickf:我正要这么说。还有,第三种选择是邪恶的。@nickf,你是对的,我忽略了这一点。我已经更新了我的答案。谢谢这是一个巨大的帮助,这是一个难以置信的社区!setTimeoutdoRequest、proxytimeout、url、proxys[proxy]在IE中不起作用,对吗?