为何在JavaScript的setTimeout中需传入匿名函数才能生效?
为什么setTimeout需要把函数放进匿名函数才能生效?
咱们先拆解下你遇到的问题核心:setTimeout的第一个参数需要接收的是一个「函数引用」,而不是函数执行的结果。
先看你最初的错误写法:
setTimeout(playBtnSoundAndAnimate(currentSequence[last]), 2000);
这里你直接写了playBtnSoundAndAnimate(...),这相当于立刻执行了这个函数,然后把函数执行后的返回值(你的这个函数没有return语句,所以返回undefined)传给了setTimeout。setTimeout拿到undefined后,相当于没有可执行的函数,自然不会有延迟效果,而且你的按钮动画和音效已经在调用setTimeout的瞬间就触发了。
再看你修改后的正确写法:
setTimeout(function () { playBtnSoundAndAnimate(currentSequence[last]); }, 2000);
这里你传给setTimeout的是一个匿名函数的引用(注意没有加括号执行它)。setTimeout会在等待2000ms之后,才去调用这个匿名函数,然后匿名函数内部再执行playBtnSoundAndAnimate,这样就完美实现了你想要的延迟触发效果。
另外还有一种替代写法,不用匿名函数也能实现,就是用bind来绑定参数:
setTimeout(playBtnSoundAndAnimate.bind(null, currentSequence[last]), 2000);
bind会返回一个新的函数引用,这个新函数已经把currentSequence[last]作为参数绑定好了,setTimeout到时调用这个新函数,就会带着参数执行playBtnSoundAndAnimate,同样能达到延迟的目的。
内容的提问来源于stack exchange,提问作者Nora
相关产品推荐
相关产品推荐

