问题 调用setTimeout的函数是什么?


我有这样的代码:

setTimeout(foo, 600);

我一直以为 foo 没有采取任何论据,例如:

function foo() { /* bars */ }

但是,执行以下操作:

function foo(a) { alert(a); /* bars */ }

弹出一个显示-7的警报。这个数字代表什么?


10515
2018-02-18 23:46


起源

好问题!我以前从没想过尝试过这个。 - Nicole


答案:


它是从计划运行它到实际运行的时间差(以毫秒为单位)。

alert(setTimeout(function(a) { alert(a) }, 2000));

如果您及时清除第一个警报,您将看到下一个警报在-10到10之间。如果您等待几秒钟,您将看到大约等于2000的时间。

setInterval也可以看到同样的事情。在Firebug中运行以下命令:

setInterval(function(a) { alert(a); }, 2000);

尝试快速关闭警报,它将再次大约为0。保持开放 - 它会给你一个很大的价值。

注意 这是在Firefox Mac上,保持警报打开将停止Javascript处理,因此在关闭警报之前计时器不会执行。上述测试的行为在其他浏览器中可能会有所不同


8
2018-02-18 23:56



是的..它在这里以非常小的方式记录: developer.mozilla.org/en/DOM/window.setTimeout 。看起来它只是一个firefox的东西 - Claudiu
相当聪明的功能,耻辱IE也没有。然后又是一个耻辱IE没有很多东西:-) - Andy E
@Andy E如果你看一下 bugzilla.mozilla.org/show_bug.cgi?id=394769 它的存在似乎存在相当大的争议,因为它减少了函数的可用性,可选参数被setTimeout调用。 - Nicole
非常好的一点。检查 arguments.caller == null 在这种情况下,这似乎是最合适的解决方法。但是,它似乎很快就会被删除,因为它符合HTML5标准。 - Andy E


从我所知道的......在计划时间和实际运行时间之间的差异的论点是毫秒。有趣的是,似乎某些浏览器甚至像整秒的一小部分......

<script>
var a = setInterval(foo, 125);

console.log(a);

function foo(b) {
 console.log(b);
}
</script>

将输出一堆零,同样适用于250,500,1000 ......同时

<script>
var a = setInterval(foo, 127);

console.log(a);

function foo(b) {
 console.log(b);
}
</script>

将输出

 -2
12
-6
8
-10
4
2
0
-2
-4
9
-8
5
3
1

3
2018-02-19 00:02