如何将参数传递给setTimeout()回调?

Squ*_*rrl 9 javascript parameters settimeout

这有什么区别:

function blankWord(){
    console.log('blank!');
    setTimeout(blankWord, 5000);
}
blankWord();
Run Code Online (Sandbox Code Playgroud)

每隔5秒就调用一次该函数,这个:

function blankWord(t){
    console.log('blank!');
    setTimeout(blankWord, t);
}
blankWord(5000);
Run Code Online (Sandbox Code Playgroud)

哪个函数反复疯狂地快速调用?

Chr*_*oph 8

由于您缺少第二种形式的参数,因此undefined从第二次调用开始,这实际上会导致4ms的超时(这是浏览器的最小值).

使用函数包装器,安全地传递您需要的参数:

function blankWord(t){
    console.log('blank!');
    setTimeout(function(){blankWord(t)},t);
}
blankWord(5000);
Run Code Online (Sandbox Code Playgroud)

将参数作为第三个参数传递会淘汰旧的IE,这就是为什么在IE8死之前不应该使用它.


Que*_*tin 6

第一个脚本5000每次都使用第二个参数调用setTimeout .

第二个脚本调用它t.第一次是5000(来自blankWord(5000);).以后每次都是undefined(从setTimeout(blankWord).

如果要传递参数,请将它们作为第三个参数传递给数组setTimeout.

setTimeout(blankWord, t, [t])
Run Code Online (Sandbox Code Playgroud)

请参阅mdn以获取polyfill以支持不识别函数的三个参数形式的旧浏览器.

  • @putvande当然.IE8(遗憾地)仍在使用中. (3认同)