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中不起作用,对吗?