如何向setTimeout()回调函数传递参数?

9

这两者之间有什么不同:

function blankWord(){
    console.log('blank!');
    setTimeout(blankWord, 5000);
}
blankWord();

这会按照预期每5秒调用一次函数:

function blankWord(t){
    console.log('blank!');
    setTimeout(blankWord, t);
}
blankWord(5000);

哪个会疯狂地重复调用函数?

2
setTimeout(blankWord, 5000, 'word') 是什么意思? - putvande
1
如何将参数传递给setTimeout()回调函数?的页面上已经有详细回答。 - Dan Dascalescu
2个回答

8

由于您在第二个表单中缺少参数,因此从第二次调用开始传递undefined,这将导致4ms的超时(这是浏览器的最小值)。

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

function blankWord(t){
    console.log('blank!');
    setTimeout(function(){blankWord(t)},t);
}
blankWord(5000);

将参数作为第三个参数传递会使旧版IE失效,因此在IE8死亡之前不应使用此功能。


6
第一个脚本每次都使用5000作为setTimeout的第二个参数。
第二个脚本使用变量t调用setTimeout。第一次是从blankWord(5000)传递的5000。随后每次都是undefined,来自于setTimeout(blankWord)。
如果要传递参数,请将它们作为数组作为setTimeout的第三个参数传递。
setTimeout(blankWord, t, [t])

请参考MDN上的polyfill以支持不认识函数三个参数形式的旧浏览器。


使用第三个参数不是一个好主意,因为它不被所有浏览器支持,而应该使用函数包装器。 - Christoph
为什么不?不是所有浏览器都支持吗?(< IE9) - putvande
3
当然。IE8(不幸地)仍在使用中。 - Christoph
1
@Christoph — 或者使用我在答案中提到的 polyfill。 - Quentin
@Igal - 它不再获得安全更新。仍有一些人坚持使用它。 - Quentin
你是否曾需要将数组作为第三个参数传递给 setTimeout,而不是单独的参数,例如 setTimeout(blankWord, t, t, ...etc);?当时的 polyfill 期望使用 setTimeout(func, delay, arg1, arg2) 的语法。 - Sebastian Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接