javascript是单线程运行的,在任何时间点,有且只有一个线程在运行javascript程序。
浏览器的内核是多线程的,一个浏览器至少有三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。
GUI与JavaScript互斥,一个执行的时候,另一个就挂起。
浏览器事件触发线程:将事件添加到待处理队列的队尾,等待javascript引擎的处理。
var start = new Date();
var end = 0;
setTimeout(function() {
console.log(new Date() - start);
}, 500);
while (new Date() - start <= 1000) {}
打印结果却大于1000ms。
原因是在1000毫秒之前,while循环占据着JavaScript线程。只有跳出while循环时,线程才会空闲下来,才会执行之前的setTimeout。
setTimeout只能保证在指定的时间后将任务插入任务队列中等候,不能保证这个任务在什么时间执行。
setTimeout有最小执行时间(一般为4ms)。
setTimeout(fun,0) 用来实现插队操作,浏览器在执行完当前任务后,立即执行setTimeout中的任务。
document.querySelector('#one input').onkeydown = function() {
document.querySelector('#one span').innerHTML = this.value;
};
document.querySelector('#second input').onkeydown = function() {
setTimeout(function() {
document.querySelector('#second span').innerHTML = document.querySelector('#second input').value; }, 0);
};
setTimeout(fun,0)也可以用setImmediate(fun)(只有IE10支持)来替代。
setTimeout中的this指向window对象,也可以用bind改变this。
var a = 1;
var obj = {
a: 2,
test: function() {
setTimeout(function(){
console.log(this.a);
}.bind(this), 0);
}
};
obj.test(); // 2
setTimeout不止两个参数,表示回调函数中传入的参数。