進程process: 電腦端安裝不少的應用軟件,每當運行一個應用程序,至關於開闢一個進程(而對於瀏覽器來講,每新建一個頁卡訪問一個頁面,都是新開闢一個進程)web
線程thread: 每個進程中可能還會同時作不少事情,若是程序中須要同時處理不少事情,則須要開闢多個線程(一個線程同時只能作一個事情)編程
=> 一個進程中,會包含0~多個線程promise
理解:瀏覽器
瀏覽器是‘多線程’的,可是JS渲染或者頁面渲染是‘單線程’的多線程
瀏覽器是多線程的(打開一個頁面之後,瀏覽器至少要分配好幾個線程同時去處理事情),可是瀏覽器只會分配出一個線程去渲染代碼(GUI渲染線程),因此說JS是單線程的:‘在JS代碼執行過程當中,一次只能處理一個事情’異步
通俗的理解:好比咱們在食堂打飯這個場景: 咱們在排隊打飯,可是當排到B打飯的時候,他的王者榮耀遊戲尚未打完(吃飯不積極,思想...😅)async
返回值:是一個數字,表明當前是第幾個定時器編輯器
=> 遇到定時器不是不處理,而是把它放在任務隊列,等到主線程空閒下來,再去任務隊列查看,這種操做是異步。中途定時器到達時間了,可是主線程並無到達時間,此時也不會當即執行定時器,必須等到主線程空閒下來。異步編程
let n = 0;
setTimeout(() => { n++; console.log(n); //=> 3 (2) }, 1000); //一秒鐘以後執行 n += 2; console.log(n); //=> 2 (1) 複製代碼
let n = 0;
setTimeout(() => { n++; console.log(n); //=> 3 (2) },0); //寫零也不是當即執行,而是有一個最小的等待時間:10ms左右 n += 2; console.log(n); //=> 2 (1) 複製代碼
let n = 10;
setTimeout(() => { n++; console.log(n); //=>11(3) }, 0); console.log(n); //=>10(1) for(let i = 0;i < 99999999; i++){} console.log(n); //=>10(2) 複製代碼
time / timeEnd:獲取他們中間代碼執行所須要的時間(這個時間須要受到電腦配置、和當前電腦運行的環境等多方面因素影響),時間只做爲參考函數
setTimeout(() => {
console.log(1); }, 20); console.log(2); setTimeout(() => { console.log(3); }, 10); console.log(4); console.time('AA'); for (let i = 0; i < 90000000; i++) { // do soming } console.timeEnd('AA'); //=>AA: 79ms 左右 console.log(5); setTimeout(() => { console.log(6); }, 8); console.log(7); setTimeout(() => { console.log(8); }, 15); console.log(9); 複製代碼
console.log(1); //=>1(1)
setTimeout(function () { console.log(2); }, 20); console.log(3); //=>3(2) for (let i = 0; i > -1; i++) {} //=>死循環,GUI線程啥都作不了,一直在這加載(其它什麼事情都幹不了) console.log(4); setTimeout(function () { console.log(5); }, 10); console.log(6); 複製代碼
定義:JS是單線程的,由於瀏覽器只分配一個線程自上而下加載代碼。因此JS中大部分任務都是同步任務。可是必定也有異步任務,定時器、事件綁定等這些都屬於異步任務。
而瀏覽器處理JS中的異步任務是:在JS代碼自上而下執行的時候,代碼進棧執行,執行完出棧,在這反反覆覆進行的過程當中。當遇到定時器等異步任務的時候,會把當前任務放在等待任務隊列(Event Queue)中存起來,而且存起來以後不會影響下面代碼的執行,主線程會繼續執行。當 把下面的同步任務執行完成以後,主線程空閒下來了會去等待隊列找哪個任務到達指定的時間點,就拿到主線程中去執行。執行完以後再去等待隊列中查看...