javaScript預編譯解讀的四大步驟

2021-08-30 06:47:38 字數 1301 閱讀 5325

js的預編譯的過程就是宣告提前的過程,其中有兩個提公升。

1.變數宣告提公升

2. 函式宣告整體提公升(優先順序最高)

我們先說一下函式裡面的宣告提公升的四大解讀規則:

1.建立函式的ao物件(也就是執行上下文)

2.找出形參和實參,,將形參和實參作為ao物件的屬性,值為undefined

3.將實參和形參的值統一

4.在函式體內找出函式宣告,函式名作為ao物件的屬性,值為函式體

eg:

a=100

function demo(e)

arguments[0]=2

console.log(e)

if(a)

} var c

a=10

var a

console.log(b)

f=123

console.log(c)

console.log(a)

}var a

demo(1)

console.log(a)

console.log(f)

首先**執行的時候建立了乙個全域性物件global也就是我們常說的window,然後將全域性裡面的所有的宣告變數和全域性的函式宣告提前

}

然後程式開始執行,執行到demo(1)時,又建立了demo的執行上下文ao物件,然後將所有的宣告變數和函式宣告提前,作為屬性名放到ao物件裡面,值為undefined

// 一開始是形參e,值為undefined,隨後變成實參e,值為1,最後函式宣告提前,變成值function(){}的函式體

b:undefined, //由於js不具備函式塊級作用域的概念,所以b也需要宣告提前

c:undfined, // 由於最新的chrome瀏覽器不在支援if裡面進行函式宣告,所以c的值為最外面的var c的值undefined

a:undefined // 是var a宣告的乙個變數,值為undefined

}

由於arguments[0]指代的就是實參e,所以當arguments[0]進行賦值的時候e的值也跟著改變了,所以e為2,不再是函式體

由於變數宣告提前的原因,a的變數的值為undefined,所以if語句不會被執行

所以console.log(b) 的值為undefined同理c的值也為undefined,當執行了a=10後,console.log(a)的值也變成了10

不過需要注意的是f=123,由於沒有宣告就開始賦值,就變成了全域性物件裡面的f,所以全域性gobal物件裡面的f的值為123

JavaScript預編譯(函式)

知識點預習 1 js檔案的執行三部曲 語法分析 預編譯 解釋執行。2 變數未經宣告就使用,系統會報錯。3 var aa 夫 子 變數的宣告和賦值,aa為變數名,夫 子 是變數值。var aa是變數的宣告,aa 夫 子 是變數賦值。4 函式宣告 function demo 函式表示式 var demo...

javascript的預編譯階段

1.變數與函式 在js中宣告乙個變數有let const var三種方式,函式有宣告函式和函式表示式兩種。2.預編譯階段做的事情 在預編譯階段,所有的var宣告的變數會被初始化為undefined,所有的宣告函式會用它的定義進行初始化,而const let宣告的變數則不會在預編譯階段執行初始化,函式...

javascript基礎 預編譯 this指向

預編譯發生在函式執行前一刻,可以拆分成一下幾步 1 生成activation object 即ao物件 執行期上下文 2 查詢形參和變數,並將其作為ao物件的屬性,值為undefined 3 將實參的值賦給形參 4 在函式體內查詢函式宣告,並將值賦予函式體 看看下面的例子 function fn a...