164.js同步與異步編程

JS中的兩種編程思想:(JS是單線程的)ajax

JS就是個傻子,腦子一根筋,作着當前的這件事情,沒有完成以前,絕對不會作下一件事情編程

1.同步:瀏覽器

  上一件事情沒有完成,繼續處理上一件事情,只有上一件事情完成了,纔會作下一件事情(JS中大部分都是同步編程的)異步

  for(var i=0;i<10000;i++) {

    if(i == 9999) {

      console.log("循環結束了")
    }
  }

  console.log("ok")

  for循環就是同步編程的,只有循環結束後,纔會繼續執行下面的代碼異步編程

  while(1){}

  console.log("ok")// 永遠都不會執行的,由於上面的循環是死迅婚,循環永遠都不會結束

2.異步:函數

  首先規劃要作一件事情,可是不是當前立馬去執行這件事情,須要等必定的時間,這樣的話,咱們不會等着它執行,而是繼續執行下面的操做,只有當下面的事情都處理完成了,纔會返回頭處理以前的事情,若是下面事情並無處理完成,無論以前的事情有沒有到時間,都踏踏實實的給我等着spa

  在JS中異步編程只有四種狀況:線程

    1)定時器都是異步編程的3d

    2)全部的事件綁定都是異步編程的code

    3)ajax讀取數據的時候,咱們都設置爲異步編程

    4)回調函數也是異步編程的

  每個瀏覽器對於定時器的等待時間都有一個最小值,谷歌5-6ms,IE10-13ms,若是咱們設置的等待時間小於這個值,也不起做用,仍是須要等到最小時間才執行的;尤爲是寫0,也不是當即執行的;

  var n = 0;

  window.setTimeout(function(){

    n++;
    console.log(n);
  },0);

  console.log(n);

  咱們定時器設置等待時間,不必定就是最後執行的時間,若是定時器以後還有其餘的事情正在處理中,無論定時器的時間有沒有到,都是不會執行定時器的

        var n = 0;
        window.setTimeout(function(){
            n++;
            console.log(n);// 不執行
        },0);
        console.log(n);
        while (1) {//->死循環
            n++;
        }
        console.log(n)//不執行       

異步編程:任務隊列

var n = 0;
        window.setTimeout(function(){
           n+=2
            console.log(n)
        },20);
        window.setTimeout(function(){
            n+=5
            console.log(n)
        },5);
        console.log(n)
        for(var i = 0; i<10000000;i++){}
        console.log(n)

相關文章
相關標籤/搜索