Javascript setTimeout拒绝将参数发送到回调

Javascript setTimeout拒绝将参数发送到回调,javascript,callback,arguments,settimeout,Javascript,Callback,Arguments,Settimeout,我一直确信传递给setTimeout的所有附加参数都将转发到回调: function say(what) { alert(what); } setTimeout(say, 500, "Hello world."); MDN证实了我的这一信念: var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]); 但与实际代码不同: function reload(cb) { var req = new XMLHt

我一直确信传递给
setTimeout
的所有附加参数都将转发到回调:

function say(what) {
  alert(what);
}
setTimeout(say, 500, "Hello world.");
MDN证实了我的这一信念:

var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]);
但与实际代码不同:

function reload(cb) {
  var req = new XMLHttpRequest();
  req.open("GET", location.href);
  //Call the callback on request completion
  req.onload = function() {
    console.log("Reloaded, calling callback.");
    if(cb!=null)
      cb();
    else
      console.log("  Callback is null.");
  }
  //Debug info
  console.log("Sending request. Callback: "+cb);
  console.log("   Arguments: "+arguments.length);
  req.send(); 
}
function waitReload() {
  console.log("Reload in 20 ms.");
  //Sending 3 arguments in 20ms
  setTimeout(reload, 20, waitReload, "BLE", "Number 666");
}
waitReload();

这将打印出:

Reload in 20 ms.
Sending request. Callback: undefined
  Arguments: 0
Reloaded, calling callback.
  Callback is null.

不向回调函数发送任何参数。为什么?第一个代码也不起作用,它会提醒
未定义的

IE9及以下版本不支持参数语法

为了方便和跨浏览器兼容性,当需要传递参数时,应使用以下语法:

setTimeout(function(){myFunction(param1,param2);} ,5000);

注意,作为一种解决方法,您可以使用
setTimeout(function(){say(“Hello World”);},500)此代码在Mozilla 37.0.2上运行。。我看到了论点:3.在chrome 42.0.2311.135 m中,代码对我也适用。它在Google chrome 42.0.2311.135中也适用。您已经检查了MDN,但您没有完全阅读它:。它在
行中说明了一些事情注意,在InternetExplorer9及以下版本中,以第一种语法向函数传递附加参数不起作用,在Firefox33.1.1中,它对我不起作用。我敢肯定,这是一种古老的语法,可能在所有Firefox(包括3年前的版本)中都得到了支持。这在Firefox到3版的版本中肯定有效,只要你遵守闭包rules@devnull69那是什么?现在,我使用了匿名方法解决方案,但我不喜欢在没有必要的时候滥发匿名方法。可能是版本特定的bug?不确定您在做什么,但这段代码肯定在所有浏览器中都能运行多年。你的代码肯定还有其他问题。我的意思是:你上面发布的代码肯定不是你所期望的那样工作。例如:当您通过它时,waitReload是什么?未定义。如果要传递函数,请先将其写入变量中。@mondjunge你错了。函数可以通过名称传递,也可以作为变量引用。甚至
myFunction.prop=true
也非常有效,经常用于模拟静态变量。