0

player对象有方法stopVideo()

1.错误的

setTimeout(player.stopVideo, 1000); //says something is undefined

2.

setTimeout(stopVideo, 1000);

function stopVideo() {
    player.stopVideo();
}

有什么区别,为什么会这样?

4

5 回答 5

3

setTimeout 函数的正确签名如下:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);

您的第二个示例有效,因为您实际上是在 setTimeout 调用中定义一个函数。

你的第一个例子实际上是这里的第二个签名。因此,要使其正常工作,您必须像处理代码一样处理它并将其作为字符串传递(类似于 eval() )。

setTimeout( "player.stopVideo()", 1000 );

这是资源的链接和参数描述的摘录:

  • func是要在延迟毫秒后执行的函数。
  • code在替代语法中是要在延迟毫秒后执行的代码字符串(不推荐使用此语法,原因与使用相同eval()
于 2013-10-18T06:12:43.577 回答
2

如果我打开 Chrome devtools 控制台并粘贴

var player = { stopVideo: function() { console.log('ohai'); }}
setTimeout(player.stopVideo, 1000);

没有任何未定义的弹出。我认为您需要提供更多背景信息并更好地解释问题所在。您的 stopVideo 功能是否正在尝试访问this

于 2013-10-18T06:16:51.353 回答
0

#1 不起作用的另一个原因:当您将 player.stopVideo 传递给 setTimeout 时,该方法的“this”对象是“window”,而不是“player”。所以,可能 player.stopVideo 不起作用。

于 2013-10-18T09:33:46.087 回答
0

为什么 1. 不起作用。这是因为在 setTimeout(....) 之前没有定义 player.stopVideo

为什么 2. 即使没有定义播放器也可以工作。当你声明一个函数 stopVideo 时,JS 引擎会在开始时预定义这个函数。stopVideo 函数在 setTimeout(...) 之前定义。这样就可以了。

于 2013-10-18T06:30:28.533 回答
0

两者互为别名。这应该有效:

setTimeout(player.stopVideo(), 1000);
于 2013-10-18T06:26:18.990 回答