注意setTimeout()
不会产生新线程。浏览器端脚本不仅是单线程的,而且 JavaScript 评估与页面渲染共享相同的单线程(网络工作者 http://www.whatwg.org/specs/web-workers/current-work/ apart).
进一步阅读:
-
JavaScript 定时器如何工作 http://ejohn.org/blog/how-javascript-timers-work/作者:约翰·雷西格
您可能想自己构建一个计时器管理器:
var timerManager = (function () {
var timers = [];
return {
addTimer: function (callback, timeout) {
var timer, that = this;
timer = setTimeout(function () {
that.removeTimer(timer);
callback();
}, timeout);
timers.push(timer);
return timer;
},
removeTimer: function (timer) {
clearTimeout(timer);
timers.splice(timers.indexOf(timer), 1);
},
getTimers: function () {
return timers;
}
};
})();
然后按如下方式使用它:
var t1 = timerManager.addTimer(function () {
console.log('Timer t1 triggered after 1 second');
}, 1000);
var t2 = timerManager.addTimer(function () {
console.log('Timer t2 triggered after 5 second');
console.log('Number of Timers at End: ' + timerManager.getTimers().length);
}, 5000);
console.log('Number of Timers at Start: ' + timerManager.getTimers().length);
以上将在控制台中显示以下结果:
// Number of Timers at Start: 2
// Timer t1 triggered after 1 second
// Timer t2 triggered after 5 second
// Number of Timers at End: 0
请注意,timerManager
上面的实现使用了Array.indexOf()
方法。这是在 JavaScript 1.6 中添加的,因此并非所有浏览器都实现了。但是,您可以通过添加实现来轻松地自己添加该方法这篇 Mozilla 开发中心文章 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility.