调用该setTimeout
函数将返回一个整数 ID,以便clearTimeout
可以使用该 ID 调用它。
如果setTimeout
被调用的次数多于 JavaScript 中的正整数,会发生什么?有安全问题吗?
调用该setTimeout
函数将返回一个整数 ID,以便clearTimeout
可以使用该 ID 调用它。
如果setTimeout
被调用的次数多于 JavaScript 中的正整数,会发生什么?有安全问题吗?
在 Chrome 中找到相关代码:
static int timeoutId()
{
static int lastUsedTimeoutId = 0;
++lastUsedTimeoutId;
// Avoid wraparound going negative on us.
if (lastUsedTimeoutId <= 0)
lastUsedTimeoutId = 1;
return lastUsedTimeoutId;
}
因此,在没有剩余正整数之后,Last ID 将仅为 1。
在这种情况发生之前,您将耗尽内存(或其他一些资源)。Javascript 数字是 64 位浮点数,它可以准确地表示高达 2^52 的整数,这意味着即使保存这么多 ID 也需要 32 PB 的内存,更不用说伴随的对象或任务了。
在我的带有 Chrome 21 的 32 位 Windows 7 系统上,带有页面的选项卡在大约 4295063 后崩溃。但它只是选项卡。我关闭了该选项卡,其他一切正常。
Opera 12 的脚本运行速度越来越慢。
Firefox 抱怨脚本花费了很多时间。
您可以自己测试:http: //jsfiddle.net/some/r58s8/