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 同上...