預編譯是js語言的難點重點之一,難點在於不便理解,重點在於必須掌握。
預編譯實際上就是js引擎的兩次掃瞄,第一次掃瞄是檢測宣告,第二次掃瞄是執行**。
預編譯分為指令碼的預編譯和函式呼叫的預編譯,先來說說指令碼的預編譯。
1.建立全域性物件go(globalobject)
2.載入指令碼檔案
3.預編譯:
4.解析執行**
1.沒有var的變數,都不是變數宣告,全部認為是window的全域性變數,不參與預編譯。
// console.log(aa); // uncaught referenceerror: aa is not defined
aa = 5;
console.log(aa); // 5
複製**
2.即使在函式中,aa也是全域性變數。(執行時)
test();
function
test()
console.log(aa); // 5
複製**
3.指令碼中的所有宣告變數,在指令碼預編譯階段完成,所有變數的宣告與實際書寫位置無關。
console.log(aa); // undefined
var aa = 5;
console.log(aa); // 5
複製**
4.指令碼中的所有函式宣告,在指令碼預編譯階段完成,所有函式宣告與實際書寫位置無關。
console.log(hh); // f hh()
function
hh()
複製**
5.指令碼中,如果變數與函式同名,那麼將覆蓋變數。
console.log(haha); // f haha()
var haha = 123;
function
haha()
複製**
6.指令碼中,只有函式能夠覆蓋變數,但是變數無法覆蓋函式。(注意:由5,6可知,函式優先順序大於變數!)
console.log(haha); // f haha()
function
haha()
var haha = 123;
複製**
7.指令碼中,後面的函式宣告會覆蓋前面的函式宣告,並且忽略引數。
haha(1); // 'haha2'
function
haha(a)
function
haha(b,c)
複製**
JS預編譯 函式預編譯和全域性預編譯
預編譯發生在函式執行前一步 建立ao物件 執行期上下文 找形參和變數宣告,將變數和形參名作為ao 屬性名,值為undefined 將實參值和形參統一 在函式體裡面找函式宣告,值賦予函式體 結果 預編譯過程 函式馬上要執行,但是還沒執行 首先建立ao物件,也就是函式它產生的儲存空間庫 ao,b und...
mysql 預編譯的好處 MySQL的預編譯功能
1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...
預編譯與編譯
一c c 源 從最初的文字變為可執行檔案主要進行三大步 預編譯階段 主要是編譯器執行 文字處理工作,並不會進行語法檢查 主要執行三大類預編譯命令 巨集定義 文字替換功能,將使用了巨集的地方採取巨集定義方式直接展開 條件編譯 文字剪下功能,根據設定的條件選擇性刪除一些 片段 包含檔案 文字插入功能 i...