单线程与事件队列
JS的代码的执行遵从单线程+事件队列的事件处理机制;
事件队列中的任务执行的条件:
1、主线程已经空闲
2、任务满足触发条件
1、定时函数(延时时间已经达到)
2、事件函数(特定事件被触发)
3、ajax的回调函数(服务器端有数据相应)
如何理解?
JS代码为单线程,简单理解为自上而下的执行;但因为事件队列的机制存在,自上而下的执行过程中,会先将任务添加到队列中,当满足两个条件:1、主线程已经空闲;2、任务满足触发条件
,才会将队列中的任务添加到事件的主线程中执行;
举个例子理解:事件队列,就比如取号排队,自上而下的执行到任务就取一个号码在队列中进行等待的时候,当被叫到号码(叫号有可能不是按顺序),即任务满足了触发条件
,此时任务被添加到事件的主线程中执行;
先看一个定时器的例子:
console.log(1);
setTimeout(function(){
console.log(2);
},1);
var sum = 0;
for(var i=0;i<100000000;i++){
sum += i;
}
console.log(sum);
console.log(3);
输出结果为:
//1 (sum的值) 3 2
再看一个事件处理的例子:
<input type="button" value="点击" id="btn">
-----------------------------分割线----------------------------------------
window.onload = function(){
var btn = document.getElementById('btn');
console.log(1);
btn.onclick = function(){
console.log(this.value);
}
console.log(3);
}
输出结果:
// 1 3 点击