天天看點

JS之預編譯

今天有幸獲得騰訊的電話面試,不幸的是面試非常慘,但是從中認識到自己的不足和找到日後該努力的方向,就拿面試中的關于js的預編譯來說吧,小編都不知道是啥,面試完後趕緊查資料,寫總結。

首先javascript是解釋型語言,自然就是編譯一行,執行一行。js運作過程分為三步:1、文法分析 2、預編譯  3、解釋執行

文法分析就是指js引擎去判斷檢查你的代碼是否存在文法錯誤,解釋執行更不用多說,自然就是執行你的代碼,然而重中之重的是預編譯,預編譯簡單了解就是在記憶體中開辟一些空間,存放一些變量與函數 ,那麼到底預編譯是在什麼時候開始發生的呢?接下來就是本章的重點所在了。

了解預編譯首先要明白函數聲明和變量指派:

function a(){ }//函數聲明  

這種形式的寫法是函數聲明,即聲明一個函數,腳本在執行之前會做預編譯處理。 ​​co​​

var a= function(){ }//變量指派  

  這種寫法是變量指派,函數在js語言裡也是一種資料,匿名函數作為變量指派給定義的變量。這種形式在預編譯處理階段,隻會給變量a配置設定一個記憶體空間,不會做初始化。初始化過程中會在執行時執行。

總結:

預編譯(函數執行前)

1. 建立AO對象(Active Object) 

2. 查找函數形參及函數内變量聲明,形參名及變量名作為AO對象的屬性,值為undefined 

3. 實參形參相統一,實參值賦給形參 

4. 查找函數聲明,函數名作為AO對象的屬性,值為函數引用

預編譯(腳本代碼塊script執行前) 

1. 查找全局變量聲明(包括隐式全局變量聲明,省略var聲明),變量名作全局對象的屬性,值為undefined 

3. 查找函數聲明,函數名作為全局對象的屬性,值為函數引用