【发布时间】:2021-06-16 08:20:26
【问题描述】:
var td = {
setTimeout: function(callback, ms){
var dt = new Date();
var i = dt.getTime(), future = i+ms;
while(i<=future){
if(i === future){
callback();
}
// i = dt.getTime();
i++;
}
}
};
td.setTimeout(function(){
console.log("Hello"); // executes immediately
}, 3000);
这种方法的问题在于,在 while 块的末尾,我将 i 的值设置为 i + 1,我认为应该将其设置为当前时间戳 (dt.getTime()),这样,future(回调函数应该执行的时间戳值)可以与当前时间戳进行比较,即i的值。
但是当我注释掉i++ 并取消注释这一行时:
i = dt.getTime();
并运行脚本,浏览器冻结。有没有办法创建一个与window.setTimeout() 具有相同目的的setTimout() 方法?
【问题讨论】:
-
实际上不可能在用户空间代码中模拟
setTimeout,因为JavaScript 没有公开任何API 来直接将函数添加到事件队列。无论如何......你的问题是什么? -
您应该明白,即使您修复了无限循环问题,浏览器仍然会锁定。那是因为循环会阻止其他任何东西被执行,直到它终止。
-
看看this answer 或多或少类似的问题。
标签: javascript