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)