js是單執行緒的, js就是個傻子, 腦子一根筋, 做著當前的這件事情, 沒有完成之前絕不會做下一件事情
同步上一件事情沒有完成, 繼續處理上一件事情, 只有上一件事情完成了, 才會做另一件事情(js中大部分都是同步程式設計的)
for(var i = 0; i < 10000; i ++)
console.log("ok")
}
-> 迴圈結束了~~for迴圈就是同步程式設計的, 只有迴圈結束後, 才會繼續執行下面的**-> ok
while(1)
console.log("ok")
永遠都不會執行 console.log("ok"), 因為上面的迴圈是死迴圈, 永遠都不會結束非同步
規劃要做一件事情, 但是不是當前立馬去執行這件事情, 需要等一定的時間, 這樣的話, 我們不會等著它執行, 而是繼續執行下面的操作, "只有當下面的事情都處理完成了", 只有當下面的事情都處理了, 才會返回頭處理之前的事情; 如果下面的事情並沒有處理完成, 不管之前的事情有沒有到時間, 都踏踏實實的給我等著
實現方法
在js中非同步程式設計只有四種情況:
定時器
var n = 0;
window.settimeout(function(), 1000);
console.log(n);
-> 0不立即執行-> 1
每乙個瀏覽器對於定時器的等待時間都有乙個最小的值, 谷歌:5~6ms ie:10~13ms, 如果設定的等待時間小於這個值, 不起作用, 還是需要等到最小時間才執行; 尤其是寫0也不是立即執行.
var n = 0;
window.settimeout(function(), 0);
console.log(n);
-> 0不保證準確的執行時間-> 1
我們定時器設定的等待時間不一定就是最終執行的時間, 如果定時器之後還有其他的事情正在處理中, 不管定時器的時間有沒有到, 都是不會執行定時器的
var n = 0;
window.settimeout(function(), 0);
console.log(n);
while(1)
console.log(n)
-> 0任務佇列進入死迴圈, 瀏覽器卡死
var n = 0;
window.settimeout(function (), 2);
window.settimeout(function (), 1);
console.log(n);
for(var i =0; i < 10000000; i++)
console.log(n);
-> 0任務佇列池-> 0
-> 5
-> 7
任務 -> 2ms執行
將任務->1ms執行新增到佇列池中, 發現時間更短的在任務佇列中提前排列
任務 -> 1ms執行
任務 -> 2ms執行
執行區var n = 0;
console.log(n); ->0
執行一千萬次的迴圈, 可能消耗的時間大於20ms也可能小於20ms
console.log(n) -> 0
此時的立即執行的任務都完成了
返回頭開始按照任務池中的任務佇列的順序開始從上到下執行.
for(var i=0; i-> 3
-> 3
-> 3
使用者點選的時候, 迴圈已經執行完了, i已經變成了3.
JS的同步與非同步
我們都知道js的 是同步執行的,也就是按照我們所書寫的順序一一執行,但是有3個特殊,他們屬於非同步執行 計時器 setinterval,settimeout 事件 onclick,onkeydown等 ajax 接下來我們分析比較一下同步執行的 和非同步執行的 之間的一些執行邏輯 1239 1011...
JS中的同步與非同步
一 js中同步非同步程式設計 瀏覽器是多執行緒,js是單執行緒的 瀏覽器只分配乙個執行緒來執行js 程序大執行緒小 乙個程序中包含多個執行緒,例如在瀏覽器中開啟乙個html頁面就占用了乙個程序,載入頁面的時候,瀏覽器分配乙個執行緒去計算dom樹,分配其他的執行緒去載入 對應的資源檔案。在分配乙個執行...
Python async非同步程式設計與同步對比
同步 def test1 for i in range 10 time.sleep 3 print i,test1 def test2 for i in range 15 time.sleep 2 print i,test2 start time time.time test1 test2 end ...