对JavaScript中的setTimeout函数的描述通常是这样的:
给定一个回调及n毫秒的延迟,setTimeout就会在n毫秒后运行该回调
其实以上描述存在严重的缺陷。
运行以下代码:
var start = new Date();
setTimeout(function(){
var end = new Date();
console.log("Time elapsed:", end - start, "ms");
},500);
while(new Date() - start < 1000){};
按照上面的定义来,结果应该在500ms或以上一点。
但真实的结果是至少1000ms。
JavaScript存在一种事件队列机制,而且事件处理器在线程空闲之前不会运行。
上述代码中调用setTimeout函数,只是将事件函数排入到事件队列里,直到线程空闲的时候(上述代码中,循环完一秒以后),才从事件队列里按顺序挑选出适合“触发”的事件,并调用此事件的处理器。