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
也非常有效,经常用于模拟静态变量。