为什么我的函数调用应该通过setTimeout立即执行?

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

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); } } 

我希望“doRequest()”函数能以大约10秒的间隔被调用,但即使使用setTimeout()函数也会立即调用。

欢迎任何想法,谢谢。

PS:即使我为“proxytimout”放置了一个任意值,也没有任何影响。

当你以这种形式给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(doRequest(url,proxys[proxy]), proxytimeout); 

编写doRequest()实际上是调用函数。 你想要的是传递函数本身:

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

你误解了setTimeout函数。

setTimeout函数接受一个函数并稍后执行。
通过编写setTimeout(doRequest(url,proxys[proxy]), proxytimeout) ,您可以立即doRequest函数,并将结果(假设它返回另一个函数)传递给setTimeout

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

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

这将通过setTimeout doRequest函数本身(而不是先调用它),并将它传递给doRequest的参数,当它最终调用它。