同步程序和异步程序
是 计算机 程序中 两种程序执行的方式
普通程序的执行方式 是 同步程序
同步->上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情(JS中大部分都是同步编程的)
for循环就是同步编程的,只有循环结束后,才会执行下面的代码。
for(var i = 0;i<100000;i++){ if(i==99999){ console.log('循环结束了'); } } console.log('ok');
下面代码的ok永远不会输出,因为上面的循环是死循环,循环永远都不会结束
while(1){} console.log('ok');
特殊程序的执行方式 是 异步程序
特殊的程序: 定时器 , 延时器 , ajax请求 , 事件绑定
var n = 0; window.setTimeout(function(){ n++; console.log(n)//1 (2) },1000) console.log(n)//0 (1)
设置定时器为0的时候,为什么结果还是一样的呢?
因为每一个浏览器对于定时器的等待事件都有一个最小的值,谷歌:5~6ms IE:10~13ms,如果设置的等待时间小于这个值,不起作用,还是需要等到最小时间才执行的;尤其是写0也不是立即执行。
var n = 0; window.setTimeout(function(){ n++; console.log(n)//1 (2) },0) console.log(n)//0 (1)
同步程序和异步程序的执行原理
1. 先执行所有的同步程序
只有所有的同步程序都执行完毕之后,才会执行异步程序
2. JavaScript程序,默认是从上至下,从左至右执行
a.遇到同步程序,就会立即执行
b.遇到异步程序,会暂时存储在 异步池 中
异步池 :
JavaScript程序执行 预解析/预解释/预编译
如果发现有异步程序,会开辟一个独立的内存空间,准备存储异步程序,这个内存空间,称为 异步池
c.当所有的同步程序执行结束之后,同时执行所有的异步程序
d.时间间隔短的,先执行,时间间隔相同的,按照顺序执行
var n = 0; window.setTimeout(function(){ n++; console.log(n)//不执行 },0) console.log(n)//0 while(1){//死循环 n++; } console.log(n)//不执行的
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<10000000;i++){ } console.log(n);//0 (2)
用户点击的时候, 循环已经执行完了, i已经变成了3.
for(var i = 0;i<oLis.length;i++){ oLis[i].onclick = function(){ console.log(i); //3 } }
Comments | NOTHING