同步程序和异步程序

发布于 2020-03-29  463 次阅读


同步程序和异步程序

是 计算机 程序中 两种程序执行的方式

普通程序的执行方式 是 同步程序

同步->上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情(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
            }
        }

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。