Javascript:为什么setTimeout(audio.play,500)不工作?
Javascript:为什么setTimeout(audio.play,500)不工作 这不起作用(Firefox52说,Javascript:为什么setTimeout(audio.play,500)不工作?,javascript,Javascript,Javascript:为什么setTimeout(audio.play,500)不工作 这不起作用(Firefox52说,TypeError:“play”调用了一个不实现接口HtmlMedia元素的对象。): 这是有效的: setTimeout(function(){document.getElementsByTagName('audio')[0].play()}, 1000.5); 为什么?我也不明白在第一个示例中,错误提示将函数作为回调直接传递给setTimeout,但这样会丢失调用pla
TypeError:“play”调用了一个不实现接口HtmlMedia元素的对象。
):
这是有效的:
setTimeout(function(){document.getElementsByTagName('audio')[0].play()}, 1000.5);
为什么?我也不明白在第一个示例中,错误提示将函数作为回调直接传递给
setTimeout
,但这样会丢失调用play函数的上下文,因为在全局对象上调用了play
,对于浏览器,这将是窗口
这就是您收到错误消息的原因:
TypeError:对未实现接口元素的对象调用了“播放”
在第二种情况下,将函数传递给setTimeout
,然后该函数将执行:
document.getElementsByTagName('audio')[0].play()
在这种情况下,立即对对象文档调用play()
相关问题:
否,.setTimeout
接受函数定义,而不是函数调用.play
是正确的,如果你知道,它是正确的。我喜欢这个问题。相关:setTimeout(document.getElementsByTagName('audio')[0]。play.bind(document.getElementsByTagName('audio')[0]),1000.5)
可以工作。您可以缩短它,因为您不需要dom元素来查找play
函数,您只需要在绑定中使用它。我不确定,是你将失去上下文
意思是你将失去上下文
?我基本上接受你的答案,但是设置超时(window.play,1000.5)
没有同样的消息(甚至没有错误信息)。@文盲window.play
是未定义的
,所以设置超时(window.play,1000.5)
等于设置超时(未定义,1000.5)
这就是为什么在这种情况下不会出现错误document.getElementsByTagName('audio')[0]。另一方面,play
不是未定义的,而是一个函数。但是setTimeout(document.getElementsByTagName('audio')[0]。play,100)
在我手动创建窗口时仍然显示相同的消息。play
方法。@code>setTimeout(document.getElementsByTagName('audio')[0].play,100)
不调用play
函数window
has,而是调用document.getElementsByTagName('audio')[0]
上下文中的函数。
document.getElementsByTagName('audio')[0].play()