JS是单线程的:js傻,做着当前的事,没完成之前,绝不会做下一件事。
JS中的两种编程思想:同步、异步。
1、同步:
上一件事情没完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情(JS中大部分都是同步编程的)
2、异步:
规划要做一件事情,但是不是当前立刻执行的这件事,需要等一定的时间。但不会一直等着它去执行,而是先继续执行下面的操作,只有当下面的事情都处理完了,才会返回头处理之前的事情;如果下面事情并没有处理完,不管之前的事情有没有到时间,都等着它处理完再去执行。
在JS中异步编程只有四种情况:
1、定时器都是异步编程的
var n=0;
window.setTimeout(function(){
n++;
console.log(n); //---->1 (第2次)
},0);
//每一个浏览器对于定时器的等待时间都有一个最小值,如果设置的等待时间小于这个值,还是需要等到最小时间才执行的,尤其是写0也不是立刻执行
console.log(n); //--->0 (第1次)
定时器设置的等待时间不一定就是最后执行的时间,如果定时器之后还有其他的事情正在处理中,不管定时器的时间有没有到,都是不会执行定时器的
var n=0;
window.setTimeout(function(){
n+=2;
console.log(n); //---->7 (第4次)
},20);
window.setTimeout(function(){
n+=5;
console.log(n); //---->5 (第3次)
},5); //两个定时器,先到先得
console.log(n); //---->0 (第1次)
for(var i=0;i<10;i++){}
console.log(n); //---->0 (第2次)
2、所有的事件绑定都是异步编程的
for(var i=0;i<oLis.length;i++){
oLis[i].onclick=function(){
tabChange(i); //不可以直接用 tabChange(i),因为异步编程,先执行完循环,所以i就都是最后的值了(oLis.length-1),这里要替换成this.index(用异步编程思想解释)
}
}
3、Ajax读取数据的时候,一般都设置为异步编程
4、回调函数也是异步编程的