player
对象有一个方法stopVideo()
1的假
setTimeout(player.stopVideo, 1000); //says something is undefined
2的真
setTimeout(stopVideo, 1000);
function stopVideo() {
player.stopVideo();
}
有什么不同,为什么会发生这种情况?
答案 0 :(得分:3)
setTimeout函数的正确签名如下:
var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);
您的第二个示例有效,因为您实际上是在setTimeout调用中定义一个函数。
你的第一个例子实际上是这里的第二个签名。因此,要使它工作,你必须像处理代码一样处理它并将其作为字符串传递(类似于eval())。
setTimeout( "player.stopVideo()", 1000 );
以下是a link to the resource以及参数说明的摘录:
func
是您希望在延迟毫秒后执行的功能。code
是您希望在延迟毫秒后执行的一串代码(使用此语法不推荐的原因与使用eval()
)答案 1 :(得分:2)
如果我打开Chrome devtools控制台并粘贴
var player = { stopVideo: function() { console.log('ohai'); }}
setTimeout(player.stopVideo, 1000);
没有任何未定义的弹出窗口。我认为你需要提供更多的背景和更好的解释错误。您的stopVideo函数是否尝试访问this
?
答案 2 :(得分:0)
两者都是彼此的别名。 这应该有效:
setTimeout(player.stopVideo(), 1000);
答案 3 :(得分:0)
为什么1.不起作用。 这是因为在setTimeout(....)
之前没有定义player.stopVideo为什么2.工作甚至玩家都没有定义。 当你声明一个函数stopVideo时,JS engerine会在开始时预定义这个函数。 stopVideo函数在setTimeout(...)之前定义。这样就可以了。
答案 4 :(得分:0)
#1不起作用的另一个原因: 当你将player.stopVideo传递给setTimeout时,该方法的“this”对象是“window”,而不是“player”。所以,可能,player.stopVideo不会工作。