js在頁面載入過程中順序執行。但是分塊預編譯、執行。
js在執行前會進行類似」預編譯」的操作,而且先預宣告變數再預定義函式。
此時注意,是宣告,不是定義,如:var a = 1; 在預編譯中,只是執行了」var a」沒有賦值,即在預編譯結束時a 為undefined。
(注意)並不是先全文編譯完在執行,而是塊編譯,即乙個script塊中,預編譯再執行,然後(按順序)下乙個script塊,預編譯再執行,但此時上乙個塊中的資料都是可以用的,但下乙個塊中的函式,宣告的變數都是不可用的。
變數沒宣告就引用,會報錯,但物件方法,物件變數沒宣告,是undefined
在函式中變數不宣告就賦值,會被認為是全域性變數,用var宣告後為函式變數
在執行函式時時也是先編譯後執行,但要注意函式定義中(即大括號中)的**即使有錯只要函式不執行,就不會有影響,但一執行函式,開始函式預編譯就會出錯。
先說下預編譯,
例如function arr()
console.log(sun);
sun的值在上面沒有,但也不能往下找,只能是undefined
var sun = 36;
sum();
console.log(sun);
sun的值在上面找,順著下來,就是36
console.log(z);
z的值在自己的函式裡面沒有,可在全域性區找,正好有z的賦值了,所以是123
}
var z = 123;
arr();
在預編譯的時候,ao是在函式執行的前一刻執行的,在執行的時候,首先它會想宣告提前,但賦值留在原地,然後將函式部分也提到前面,再從上往下執行,如果在函式裡面找不到值,它會在全域性裡面去找值,再然後進行輸出。
總結分為四步
第一步,建立ao(activation object/執行期上下文)物件
第二部,找形參和變數宣告,將變數和形參作為ao的屬性名,值為undefined
第三步,將實參值和形參統一
第四步,在函式中找函式宣告,值賦予函式體
JS預編譯 函式預編譯和全域性預編譯
預編譯發生在函式執行前一步 建立ao物件 執行期上下文 找形參和變數宣告,將變數和形參名作為ao 屬性名,值為undefined 將實參值和形參統一 在函式體裡面找函式宣告,值賦予函式體 結果 預編譯過程 函式馬上要執行,但是還沒執行 首先建立ao物件,也就是函式它產生的儲存空間庫 ao,b und...
mysql 預編譯的好處 MySQL的預編譯功能
1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...
預編譯與編譯
一c c 源 從最初的文字變為可執行檔案主要進行三大步 預編譯階段 主要是編譯器執行 文字處理工作,並不會進行語法檢查 主要執行三大類預編譯命令 巨集定義 文字替換功能,將使用了巨集的地方採取巨集定義方式直接展開 條件編譯 文字剪下功能,根據設定的條件選擇性刪除一些 片段 包含檔案 文字插入功能 i...