瀏覽器的預解析過程

2022-03-06 15:12:58 字數 1690 閱讀 5391

var foo;

function foo(){}

console.log(foo);

結果是函式體function foo(){}

接著下面一道題:

function foo(){}

var foo;

console.log(foo);

結果也是函式體function foo(){}

所有就有很多人說,函式宣告的優先順序大於變數宣告的優先順序。那麼,為什麼呢?這就要從瀏覽器的預解析說起了。

搜尋預解析關鍵字 

執行預解析 

至此識別符號中儲存了函式的引用

看了預解析原理以後,下面咱們回到本文開頭的兩題,分析下預解析的過程,詳細的了解為什麼函式的優先順序高於變數的優先順序。follow me—->

先看第乙個

var foo;

function foo(){}

console.log(foo);

預解析過程為:

var foo;<----變數宣告的var

var foo;<----函式宣告抽出的var

foo=function (){}<----函式宣告抽出的賦值

console.log(foo);

再來看第二個,

function foo(){}

var foo;

console.log(foo);

預解析過程為:

var foo;<----變數宣告的var

var foo;<----函式宣告抽出的var

foo=function (){}<----函式宣告抽出的賦值

console.log(foo);

比較這兩個,你發現了什麼?原來他們的預解析過程一樣啊,這也就是為什麼函式優先順序高於變數的原因了。

如果你理解了上面的內容,那麼下面再出乙個題:

var a=1;

function a(){}

console.log(a);

這個瀏覽器是如何解析的呢?下面來跟著我的思路一起走: 

1. 解析器首先搜尋var 關鍵字,結果第一行就發現了,把它提取到開頭。 

2. 解析器搜尋function關鍵字,第二行發現了,首先分離var+函式名,此時發現和第一步的一樣,不做處理,然後開始分離函式的賦值,也就是a=function (){},此時a為函式體。 

3. 解析器接著處理變數的賦值,a=1,上一步的函式體被覆蓋掉,此時a=1。 

4. 最後處理console.log(a),自然而然的結果為1。

下面是解析器處理的**過程:

var a;<----變數宣告的var

var a;<----函式宣告抽出的var

a=function (){}<----函式宣告抽出的賦值

a=1;

console.log(a);

dns prefetch和瀏覽器解析過程

dns prefetch charset utf 8 rel dns prefetch href head 頁面一載入,就立即把 href 裡指定的網域名稱做 dns 查詢然後快取起來,等真正請求這些網域名稱下資源的時候,就省去了 dns 查詢時間,提高頁面載入速度 資源請求 瀏覽器 後端伺服器 請...

瀏覽器載入 解析 渲染的過程

恢復內容開始 最近看一些前端的面試題,發現很多公司都會問到瀏覽器載入,解析,渲染相關的問題。這篇隨筆整理一下這些知識,便於理解瀏覽器是怎麼工作的。首先,前端在大多數開發過程中並沒有用到這些知識,那我們為什麼還要去理解瀏覽器的執行過程?事實上,對瀏覽器的理解能幫助前端開發者更好的實現最佳頁面。比如,瀏...

瀏覽器預解析之變數提公升奧秘,手動滑稽

提公升的物件包括 函式宣告 變數宣告 函式內部作用域預設形參宣告 1.函式宣告和變數宣告是同乙個變數名 當函式宣告和變數宣告衝突的時候,變數宣告無法覆蓋函式宣告,變數賦值可以覆蓋函式宣告 所以最後結果為10 具體 a a 呼叫函式 a 10 變數 var a 全域性變數 或者 var a 10 同上...