2012-10-26 91 views
0

下面是一些示例代码的链接。Javascript超时对象究竟是什么?

http://jsfiddle.net/4djNt/2/

我认为,直到我开始测试,一个setTimeout()的返回值将是某种浏览器的对象。

实际上它似乎是一个简单的整数。我也相信,将返回值setTimeout分配给全局变量意味着只能有一个这样的对象。但是,如果您看到如果多次单击“启动计时器”按钮,则可能会同时运行多个计时器。

例如

  • 我点击开始按钮
  • 脚本创建一个超时
  • timeout 1,由于火在五秒钟
  • 一秒钟后,我又和现在点击有一个timeout 2
  • 现在我有timeout 1由于在四秒钟的火灾和timeout 2在五秒
  • 我点击停止按钮,只timeout 2被清除

用户点击创建多个计时器的问题可以通过设置之前,总是清除当前的超时VAR来解决。但我真的很想理解Javascript在这里做的实际操作。

+1

“但我真的很想理解Javascript在这里做的实际操作。” ---你已经在你的“例如”列表中解释它 – zerkms

+1

返回值有点像一个计时器ID。要停止一个特定的定时器,你运行'clearTimeout(id)'。 – Blender

+1

来自[MDN](https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout)*“timeoutID是超时的数字ID,稍后可以在窗口中使用。当你将它分配给相同的全局变量时,你只是覆盖值 – Phil

回答

4

setTimeoutsetInterval返回一个数字。该号码是计时器的id。主动定时器可分别使用clearTimeoutclearInterval来停止。

如果你失去了定时器的ID,你要么再次猜测它,要么等待它完成(假设它是超时)。

如果定时器未在delay参数中指定的毫秒数中被取消,则它将在全局上下文中执行回调函数。

+0

这是有道理的,我的错误是假设有某种对象,myWindow = window.open('foo')返回对窗口本身的引用。创建完全是私人的浏览器,我们只能得到一个数字来标识它。 – AmbroseChapel

+0

@AmbroseChapel,它允许浏览器使定时器更高效,而无需执行任何JavaScript对象管理。对象,你当然可以使用'start'和'stop'方法创建一个'Timer'构造函数。 – zzzzBov

2

返回值setTimeout可以传递给clearTimeout以防止计划的任务运行。如果变量已设置并且再次按下按钮,则首先运行clearTimeout,然后运行setTimeout,假定您只需要第二次推送即可。

0

提问者只询问超时对象,这些对象在某些环境中代替数字返回,例如timeoutObject。为了取消回调,将整个超时对象传递给clearTimeout(toObj)是个诀窍。

{ 
    called : bool 
    _idleTimeout : null 
    _idlePrev : null 
    _idleNext : null 
    _idleStart : null 
    _onTimeout : function(){} 
    _repeat : null 
    unref : function() {} 
    ref : function() {} 
    close : function() {} 
} 
+0

欢迎来到Stack Overflow!如果你也可以解释从哪里得到输出,那将是非常好的。 – ssice