1. 程式人生 > >js非同步和單執行緒

js非同步和單執行緒

1、同步和非同步的區別     a>同步會阻塞程式碼執行,非同步不會     b>alert()是同步  setTimeout()是非同步 2、關於setTimeout();    console.log(1); setTimeout(function() { console.log(2);}, 0); console.log(3); setTimeout(function() { console.log(4);}, 0); console.log(5);   // 13524   3、前端執行非同步的場景:      a>定時任務      b>網路請求   ajax  請求  動態img      c>事件繫結 4、什麼是非同步: console.log(100); setTimeout(function() { console.log(200);}, 0); console.log(300); // 100 300 200

非同步結果:100 300(不做等待) 200

同步結果:100 200(等待) 300   (會阻塞後面程式碼的執行)

對比alert();

console.log(100);

alert(200);

console.log(300);

結果:// 100  200   點選確認    300

5、什麼時候需要非同步?

    a>可能發生等待的情況

    b>不能像alert一樣阻塞程式執行

    換言之,所有的“等待的情況”都需要非同步

6、前端使用非同步的場景:

    a>定時任務

   b>ajax

   demo1:ajax請求

    console.log('start');

$.get('XXX', function(data) {

    console.log(data);

});

console.log(end);

執行結果: // start  end  object

分析:

ajax請求需要等待

過程:a》列印start

        b》執行 $.get 後,函式 data1 會被暫存起來,不會立即執行(單執行緒的特點,不能同時幹兩件事)

        c》執行最後一行,列印300

        d》待所有程式執行完,處於空閒狀態時,會立馬看有沒有暫存起來的要執行

        e》發現暫存起來的 $.get 中的 data1 未執行,待請求 data1.json返回 後,立即執行 data1

 

demo2:動態圖片的載入

    console.log('start');

    const img = document.getElementById(‘img’);

    img.onLoad = function() {

         console.log('loadImg');

    };

    console.log(end);

   執行結果: // start   loadImg  end       不知道圖片何時完成載入,需要等待

 demo3:事件繫結

   console.log('start');

   document.getElementById('box').on(click, function() {cosnole.log('click);});

   console.log('end');

  // start end      (點選)click     不知道使用者何時點選,需要等待

7、非同步和單執行緒:

JS 是單執行緒的語言,所謂“單執行緒”就是一根筋,對於拿到的程式,一行一行的執行,直到上面的執行為完成,只能做這一件事