JS執行順序

2021-08-19 20:22:24 字數 2166 閱讀 2982

一、語法分析

瀏覽器將所有js檢查一遍,看有沒有語法錯誤,這裡並不會執行,沒有錯誤則進行第二步,預編譯

二、預編譯

首先要理解函式宣告整體提公升,變數 宣告提公升。

這裡要注意變數的提公升,一般我們宣告乙個變數都是

var a = 1;

console.log(a) //1

//但實際上拆分成了兩步,真正執行是這樣的

var a;

a = 1;

console.log(a) //1

//如果將console.log放a前面會列印出undefined

console.log(a) //undefined

var a = 1;

//因為變數的宣告提公升了,但是賦值並沒有提公升,實際上是這樣的

var a;

console.log(a);

a = 1;

1、預編譯的時候會建立乙個ao物件(activation object)執行上下文;

2、找形參和變數宣告,將形參和變數作為ao物件的屬性名,值為undefined;

3、將形參和實參統一;

4、在函式體裡找函式宣告,值賦給函式體

舉個例子:

function fn(a);

console.log(a);

var b = function(){};

console.log(b);

function c();

}fu(1);

//列印結果依次對應

function a(){}

123123

function(){}

function fn(a)

console.log(a);

var b = function(){}

console.log(b)

function c();

}fn(1)

預編譯的時候建立乙個ao物件:

1、預編譯的時候會建立乙個ao物件(activation object)執行上下文;

ao=2、找形參和變數宣告,將形參和變數作為ao物件的屬性名,值為undefined;

ao=3、將形參和實參統一

ao=4、在函式體裡找函式宣告,值賦給函式體

ao=, //此時a的值已經被覆蓋了,因為函式宣告整體提公升

b : undefined, //b不是函式宣告,是函式表示式

c : function c(){}

}最後執行的時候是從ao裡面取值

第乙個console.log(a) 列印 function a(){}

第二個console.log(a) 因為又重新定義了a,所以列印 123

第三個console.log(a) 和第二個同理,列印 123

第四個console.log(b) 因為把乙個函式賦值給了b,所以列印 function (){}

三、語句執行

最後執行的時候是從ao裡面取值

第乙個console.log(a) 列印 function a(){}

第二個console.log(a) 因為又重新定義了a,所以列印 123

第三個console.log(a) 和第二個同理,列印 123

第四個console.log(b) 因為把乙個函式賦值給了b,所以列印 function (){}

function fn(a) 因為又有乙個函式a,函式宣告整體提公升

c = function c(){}  因為有乙個函式c,函式宣告整體提公升

然後開始從上往下執行

*/console.log(a);

var a = 123;

console.log(a);

function a(){}

console.log(a);

var b = function(){}

console.log(b);

function c();

}fn(1);

js執行順序

執行緒 cpu 排程的最小單位 程序 cpu 資源分配的最小單位 js是單執行緒的,在同一時間,只能做一件事。但是js有同步任務和非同步任務。同步 有a,b兩段 執行完a後執行b 非同步 有a,b兩段 a和b同時執行 在非同步任務中還有微任務和巨集任務 微任務 promise,process.nex...

js 執行順序

同步任務 非同步任務 同步任務 立即執行 非同步任務 進入到非同步佇列當中 event queue eg ajax,settimeout,then,setinterval event loop 事件迴圈 task macro task 巨集任務 micro task 微任務 macro task 巨...

js執行順序

本篇隨筆主要通過兩個案例來梳理promise執行順序和promise async await執行順序,介紹之前預設大家已經了解這兩個api的使用方法並且了解js巨集任務與微任務概念。文章末尾會附上相關資料,有興趣的可以檢視。一 promise console.log script start set...