hello,日常更新的我「浪」回來了!!!
js中有三座高山:非同步和單執行緒、作用域和閉包、原型原型鏈
今天「浪」的主題是js中的非同步和單執行緒的問題。
主要從這三個方面入手
一、什麼是非同步(與同步作比較)
二、前端使用非同步的場景
三、非同步和單執行緒
一:什麼是非同步
說非同步之前我們先了解一下同步:同步可以簡單的來說就是順序執行
console.log(100);接下來我們來說非同步(當執行非同步**時,不會影響另一些**執行)alert(200) //
點選確定往下執行,如果不點選確定,就會阻塞不往下執行
console.log(300)
//列印100,彈出200(點選確定往下執行),列印300
console.log(100);這段**的執行結果為:settimeout(
function() , 1000);
console.log(200)
非同步和同步的區別就在於:
同步:會阻塞後續**的執行
非同步:不會阻塞**執行
二:前端使用非同步的場景
1、定時任務:settimeout 、 setinterval(**同上)
2、網路請求 :ajax請求、動態的建立
載入、
console.log("start")$.get("./data.json",(data)=>)
console.log("end")
//列印start,列印end 等待獲取**函式傳來的data資料渲染頁面
//為啥ajax要用非同步呢?因為向伺服器請求資料,誰也不知道多長時間能返回資料(有可能幾秒,有可能拿不到資料)
如果資料拿不到,頁面肯定還是要正常顯示的,所以必須是非同步
console.log("start")3、事件繫結var img = document.createelement("img");
img.onload =function
() img.src='/aa.png'console.log("end")
//列印start,列印end,載入
console.log("start")三 、非同步和單執行緒document.getelementbyid("btn").addeventlistener("click",()=>)
console.log("end")
//列印start,列印end,載入
下面**和介紹非同步的**區別是延時器沒有設定時間
console.log(100);執行順序:settimeout(
function
() );
console.log(200)
先列印100,
執行settimeout,這個函式會被暫存起來,不會立即執行(因為單執行緒只能乙個乙個執行)
列印300,
等待所有的程式執行完後,瀏覽器會看有沒有暫存的,
暫存裡面有settimeout,settimeout沒有設定時間,不用等待然後立刻執行
那什麼叫單執行緒呢??
簡單來說就是一次只能幹一件事,乙個乙個排隊,不能多個一起執行(因為不是多執行緒)
標準定義:瀏覽器只分配給js乙個主線程,用來執行任務(函式),但一次只能執行乙個任務,這些任務形成乙個任務佇列排隊等候執行,
但前端的某些任務是非常耗時的,比如網路請求,定時器和事件監聽,如果讓他們和別的任務一樣,都老老實實的排隊等待執行的話,
執行效率會非常的低,甚至導致頁面的假死。所以,瀏覽器為這些耗時任務開闢了另外的執行緒,主要包括http請求執行緒,瀏覽器定時觸發器,
瀏覽器事件觸發執行緒,這些任務是非同步的。
JS中的同步與非同步
一 js中同步非同步程式設計 瀏覽器是多執行緒,js是單執行緒的 瀏覽器只分配乙個執行緒來執行js 程序大執行緒小 乙個程序中包含多個執行緒,例如在瀏覽器中開啟乙個html頁面就占用了乙個程序,載入頁面的時候,瀏覽器分配乙個執行緒去計算dom樹,分配其他的執行緒去載入 對應的資源檔案。在分配乙個執行...
JS中的非同步程式設計方法
js語言的執行環境是 單執行緒 所謂單執行緒,就是乙個時間只能完成乙個任務,如果有多個任務,就必須排隊。單執行緒 的壞處是 只要有乙個任務耗時很長,後面的任務就必須排隊等待,會拖延整個程式的執行。為了解決這個問題,js的任務執行模式分為兩種 同步 synchronous 和非同步 asynchron...
js中的同步和非同步
一 單執行緒 j ascript 語言的一大特點就是單執行緒,也就是說,同乙個時間只能做一件事,需要排隊執行。如果前面的a任務會花費大量的時間,就會導致後面的b任務停止執行,知道a執行完才會執行b。如果排隊是因為計算量大,cpu忙不過來,倒也算了,但是很多時候cpu是閒著的,因為io裝置 輸入輸出裝...