js的預編譯

2021-10-07 04:27:41 字數 986 閱讀 3053

函式執行前函式究竟做了什麼?

一。 函式執行前,首先會通篇檢查有沒有語法或者**寫錯的,如果有就直接報錯,如果沒有就會進行下一步:

二。 函式的預編譯階段

1. 首先會在函式內生成乙個ao物件,

2. 變數或者形參作為函式的屬性名或者鍵名屬性值是undefined

3. 實參給形參

4. 函式宣告作為屬性值,屬性名為funciont(){}函式體

三。執行js**

作用域鏈

作用域鏈:當函式執行時會生成ao物件,並且把這個ao物件放在[[scope]]的最頂端,和函式建立時的環境,形成鏈式結構,我們把這種鏈式結構叫做作用域鏈。

作用域鏈 = 函式執行時的ao物件+ 函式建立時的環境

這句話說白了就是當乙個函式 **執行** 之後首先從自己本身裡面找所需要的變數,注意,是執行之後,如果沒有執行這個函式就相當於是乙個死的函式,自己就不存在什麼ao物件了。
裡面寫什麼都不會報錯,如果自己裡面沒有所需要的變數,就順著自己的父級去找,而自己所處的環境就是父級函式建立時候的ao

變數查詢規則: 沿著作用域鏈頂端 自上而下尋找變數

此時的[[scopes]]此時就是我們常說的作用域,其中儲存了ao物件的集合

go物件:

函式預編譯階段也會也有go物件,go物件也可以當作是window物件吧,

也就是說當頁面開啟時候就會產生go物件,頁面中的函式都處於go中

go的執行有三個步驟

1.生成ao物件

2.變數作為go物件的屬性名或鍵名

3.函式宣告作為屬性名,屬性值為函式體

js的預編譯

預編譯發生在函式執行前一刻 預編譯執行的步驟 1建立執行期上下文,activation object 即ao 2找形參和變數宣告,將形參和變數宣告做為ao的屬性名,尚未賦值,值為 undefined 3將形參和實參相統一,即把實參的值傳到形參裡面去 4在函式體裡面找函式宣告,賦值函式體 functi...

js的預編譯

1.語法分析 通篇掃瞄看有沒有語法錯誤 2.預編譯 3.解釋執行 預編譯有兩種情況 一種是全域性的預編譯 一種是函式的預編譯 函式的預編譯 預編譯 函式執行的前一刻 下面 再預編譯的過程中發生了什麼變化呢 function demo num var num 13 console.log num 13...

js的預編譯

js執行的三步 語法檢查,預編譯,解釋執行.js預編譯前 window物件 全域性 1.任何位置上的變數未宣告直接賦值是全域性變數,發到window裡 2.在函式外宣告的變數也是全域性,放到window裡.js預編譯時 對函式來說 1.生成函式的ao物件 作用域 2.把函式的形參和變數宣告放到ao物...