原生js底層基礎(五)預編譯 遞迴

2021-09-27 02:50:44 字數 1833 閱讀 6408

寫這個系列為了全面積累鞏固自己的js基礎,包括一些基礎的和稍微冷門、深入的,還有一些面試題,如果你也認為基礎知識很重要,快來一起交流學習啦~ ^ - ^

理解預編譯以後對找bug很有用!!!

函式體裡面的預編譯—發生在函式執行的前一刻

1) 暗示全域性物件 :變數未經宣告就賦值,此變數就為全域性物件(即window物件)所有

a =

10console.

log(a)

//10

console.

log(window.a)

//10 這與上一句等價

2)預編譯過程

1.建立區域性ao物件(activation object)/全域性go物件,他們相當於乙個即執行期上下文,前者是函式內的,後者是window全域性的

2.找形參和變數宣告,將變數和形參名作為ao/go屬性名,值為undefined,如果有重複就只寫乙個

3.將實參值和形參統一

4.找函式宣告,賦值給ao裡對應名字的屬性

栗子(你一定可以看懂):

var a =5;

function

test

(a) console.

log(b)

}test(1

);

編譯過程 步驟

過程**

1建立全域性與區域性上下文go

go ao

2找形參和變數宣告

go ao

3將實參和形參相統一

go ao

4找函式宣告,新增/替換對應內容

go ao }

執行過程

執行過程按**順序執行,因此請將以下**注釋對應上面編譯過程來看

var a =5;

//將go裡的a改為5

function

test

(a)//編譯時已看過,忽略

console.

log(b)

;//輸出ao裡的b,值為2

}test(1

);

特點: 先執行的函式最後返回結果

要點:

例如:n的階乘

function

mul(n)

return n*

mul(n-1)

;}

筆試題(用友)

1.求輸出結果

function

test()

test()

;

結果:

undefined

2報錯,hello is not defined

編譯過程 步驟

過程**

1建立區域性上下文aoao2

找形參和變數宣告ao3

將實參和形參相統一ao4

找函式宣告,新增/替換對應內容

go ao

因此第乙個輸出時,foo為undefined;第二個輸出時,foo已經有值了,輸出2,第三個hello未定義,會報錯,面試時最好把報錯資訊也寫上

function

print()

}print

()

輸出1

編譯過程 步驟

過程**

1建立區域性上下文aoao2

找形參和變數宣告ao3

將實參和形參相統一ao4

找函式宣告,新增/替換對應內容

ao第三行test()執行時test已經被賦值為乙個函式了,因此可以輸出1

原生js底層基礎(四)函式 arguments

寫這個系列為了全面積累鞏固自己的js基礎,包括一些基礎的和稍微冷門 深入的,還有一些面試題,如果你也認為基礎知識很重要,快來一起交流學習啦 1 命名函式表示式var test function abc 執行函式時,test 才有效,abc 無效,因此這個function右邊的abc沒有什麼實際意義 ...

原生JS基礎知識(五)

我的github 函式封裝 減少 耦合 抽象規則 引數 引數js形參和實參天生不定參 function test 1 a,b,c test 1 1,2 實參列表arguments 類陣列 function test 2 a,b,c console.log arguments.length 4 tes...

原生js基礎

js常見資料型別 數字型別 字串 布林 陣列 型別轉換 number 資料 元資料是什麼格式就轉換成什麼格式的數字 parsefloat 資料 將資料轉換成帶小數點的數字 parseint 資料 將資料轉換成整數 字串 string 容器型資料型別,不可變有序 表示 使用 或 模板字串用 轉義字元 ...