目錄
一.前言
二.預解析案例
一.前言
? ? ? ? 關于預解析,我們通過今天學習就能夠知道解析器運行JS分為哪兩步;能夠說出變量提升的步驟和運行過程;能夠說出函數提升的步驟和運行過程。
二.預解析案例
? ? ? ? 預解析,簡而言之,也就是javaScript解析器在運行javaScript代碼的時候所進行的第一步。第二步則就是執行代碼,按照代碼書寫的順序從上往下執行。
? ? ? ? 在預解析過程中,JS引擎會把JS里面所有的var還有function提升到當前作用域的最前面。其中預解析又可以分為變量預解析(變量提升)和函數預解析(函數提升)。
? ? ? ? 下面我們來分析下以下代碼的執行結果:
console.log(num1)var num1=10
? ? ? ?
?????????在我們聲明賦值num1變量的前面,就執行了輸出num1的表達式,這樣的結果會是什么呢?
我們來看下執行結果:
????????
? ? ? ? 通過運行編譯我們會發現我們的執行結果是undefined,為什么會是這樣的結果呢?
? ? ? ?這就是我們預解析的神奇之處,下面我們來分析下這個預解析的詳細過程。
? ? ? ? 因為上面那個案例有變量的聲明,根據我們的變量預解析,再將變量提升之后,實際上執行的代碼如下:
????????
?var num1;console.log(num1)num1=10?
? ? ? ? ?
????????到這里我們就可以知道,變量提升就是把所有的變量聲明提升到當前作用域的最前面,但不提升賦值操作。因此這里我們的num1在聲明之后,由于沒有賦值,所以得到的結果自然也就是undefined了。
? ? ? ?
????????下面我們再來看看函數的預解析:
? ? ? ? 首先分析下下面這段代碼的執行結果會是什么樣的:
????????
function fn(){var a=b=c=7console.log(a)console.log(b)console.log(c)}fn()console.log(c)console.log(b)console.log(a)
? ? ? ? 結果可能出乎大家的意料哦,現在讓我們來看下結果:
????????
? ? ? ? 我們可以發現最后的結果是輸出5個7,跟最后一個未定義的報錯提示。
? ? ? ? ?現在我們來分析下結果,由于我們用var聲明多個變量的格式為:
var a=7,b=7,c=7
? ? ? ? ?中間只需用逗號隔開就可以了,而案例中的聲明其實是這樣的結果:
var a=7;
b=7;
c=7
? ? ? ?在函數中,沒有使用var聲明的變量就會從局部變量轉為全局變量,也就是說,案例中的b和c此刻都變成了全局變量。
????????因此我們在執行fn()這個函數的時候,就會把a,b,c的值都輸出出來,也就是3個7。再執行b和c的輸出,就把剩下的2個7給輸出來。由于a使用了var聲明,因此我們的a依然是fn函數里面的局部變量。因此最后的結果自然就是undefined啦。
? ? ? ? 最后,函數的提升也就是把所有的函數聲明提升到當前作用域的最前面,但不調用函數。
?
?
? ? ? ?
? ? ? ??
????????